php - 检测是否发送了电子邮件

时间:2013-01-07 07:11:56

标签: php email

我正在建立一个自动通讯,我有点坚持这个问题。 我需要知道电子邮件是否已发送。这是我的代码

 @$send = mail($emailRecipient, $subject, $message, $headers);

我试图将它添加到if语句,但它在这里不起作用是代码。

if( @$send = mail($emailRecipient, $subject, $message, $headers)){
   //do something
}else{
  //do something
}

4 个答案:

答案 0 :(得分:1)

仅为了完整性,应该提到的是,有一种方法可以通过PHP发送电子邮件,并知道接收MTA是否真的接受了它(同样,并不意味着它被传递给用户或在SMTP握手后静默丢弃)。

理论上可以在PHP中编写一个SMTP客户端,例如使用内置的流函数,如stream_socket_client,以便通过直接原始tcp与接收MTA进行通信在SMTP协议请求和响应中形成的连接。

发出SMTP命令的一般逻辑如下:

<?php
$fp = stream_socket_client("tcp://fqdn-of-receiving-mta:25", $errno, $errstr, 90);
fwrite($fp, "EHLO LOCALHOST\r\n");
fwrite($fp, "MAIL FROM: youremailaddress@something.tld\r\n");
fwrite($fp, "RCPT TO: recipient@remotedomain.com\r\n");
fwrite($fp, "DATA\r\n");
fwrite(
    $fp,
    "Subject: your subject text\r\n" . 
    "First line of message body\r\n" .
    "At the end of the message body one single period char should be placed before and after EOL character\r\n" .
    "Like this: \r\n" .
    ".\r\n" 
);

当然,这显然是不完整的(经验丰富的开发人员会注意到我既没有收听也没有解析我得到的SMTP响应)。为了使用这种方法,必须严格重新发明PHP语言的轮子。

如何使用它来检测是否发送了电子邮件?

嗯,你至少会有3种类型的信息:

  1. 接收主机是否有效并且完全收到电子邮件
  2. 您是否在握手期间没有退回(SMTP 5xx回复课程)
  3. 提交消息文本后是否收到SMTP 250 2.0.0 Ok
  4. 同样,这只是出于教育目的,除非您准备与开发符合标准的SMTP客户端的项目结婚,否则不要在家中这样做。

答案 1 :(得分:0)

你也可以尝试这个

$send = mail($to,$subject,$msg);
if($send)
{
    echo "Your Account is Successfully Created. You must Activate your account.";
}
else
    echo "Failed to send";

答案 2 :(得分:0)

我想在@Daya的答案中添加更多信息,我想在他的答案中进行一些修改,如下所示:

如果电子邮件将成功发送,则不是问题,但如果邮件功能有错误,那么开发人员将如何获取错误,为此,他/她可以使用error_get_last()函数来获取最后的错误,并且修改如下:

if(!$mail) {
  print_r( 'Mailer error: ' . error_get_last());
} else {
  echo 'Message has been sent.';
}

答案 3 :(得分:-2)

$ send = mail($ emailRecipient,$ subject,$ message,$ headers);

检查$发送的返回值,如If($ send ['error_code'] == 0){echo“success”; } Else {Echo“错误”; }