如何知道PHP邮件发送失败

5
我正在使用 PHP 的 mail() 函数发送邮件,如果发送失败,我希望能够收到一条错误信息。
$to = 'itsdfdsf@7sisters.in';
    $email_from = "info@7sisters.in";

    $full_name = 'XXXX';
    $from_mail = $full_name.'<'.$email_from.'>';



    $subject = "testing sender name";
    $message = "";
    $message .= '
            <p><strong>This is only a test mail. Please do not reply.</strong><br />
    ';
    $from = $from_mail;

    //$headers = "" .
    //         "Reply-To:" . $from . "\r\n" .
    //         "X-Mailer: PHP/" . phpversion();

    $headers = "From:" . $from_mail . "\r\n" .
               "Reply-To:" . $from_mail . "\r\n" .
               "X-Mailer: PHP/" . phpversion();


    $headers .= 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";        

    if(!mail($to,$subject,$message,$headers))
    {
        echo 'failed !!';
    }

但是尽管$to邮件地址不存在,它并没有显示失败!!


如果您设置了发件人和回复地址头,则您真正希望的就是在该地址上收到退信。还有一个单独的“Bounces-To:”头可以指定。 - Michael Berkowski
这是因为在PHP将消息交给SMTP服务器进行传递后,它无法直接知道传递的成功或失败。SMTP服务器不一定会立即传递消息。您只能等待退信。 - Michael Berkowski
那么实际上,我们无法知道邮件发送是否成功或失败? - AssamGuy
2
是的,你只能通过 mail() 将消息传递给出站 SMTP 服务器时发生的错误。之后它会发生什么 PHP 是无法知道的。 - Michael Berkowski
7个回答

5
邮件方法只是发送邮件。如果没有收到任何错误(例如未找到服务器等),它将返回成功。除非您创建一些代码来处理退回的电子邮件等,否则无法知道邮件是否实际上已经到达收件人的收件箱。

3

检查mail的返回值:

如果邮件成功被接受并发送,返回TRUE,否则返回FALSE。

重要的是要注意,即使邮件已被接受发送,也不意味着邮件将真正到达预期目的地。

虽然它返回True可能意味着你的邮件程序已经接受了信息,但在试图发送给空地址时会失败...

你应该通过验证器检查$to是否为有效地址,如果无效就抛出一个错误,不要依赖mail()过滤掉那些你已知道错误或可以轻松检查的事情。

--更新

请查看@SeRPRo,但你尝试进行的操作很难通过程序测试-发送一封电子邮件需要用户点击链接以验证其真实性比尝试查询SMTP服务器更容易和可靠(即:有不同程度的故障)。还要注意,你的预期行为(代码方面)很难与垃圾邮件发送者区分开来,因此,如果你避免验证电子邮件路线,则可能会发现这很困难。


但是就像上面的情况一样,$to是一个有效的电子邮件地址,但它并不存在。所以我将无法找到发送到$to的邮件是否失败了? - AssamGuy

3

我认为你想要检查一个真实的电子邮件地址,而不仅仅是一个格式正确的电子邮件地址。因此,我建议你查看这篇博客文章


1

但是尽管 $to 邮件不存在,它并没有显示失败!

实际上,邮件被传递到 SMTP 服务器并不意味着它将被传递到最终用户。在 PHP 中没有简单的方法来检查它是否已被传递。


0
使用phpmailer发送电子邮件,并设置$mail->AddCustomHeader('Return-path:bounce@mail.com'); 如果收件人的邮件地址不存在或者收件人无法通过其他方式接收电子邮件,将会在bounce@mail.com发送退信邮件。

0

你可以抄送自己来测试它是否离开了发件箱。


我不明白你的意思,请再解释一下。 - AssamGuy

0
在我的情况下,通过命令行参数“-f”设置返回路径有所帮助,该参数可以通过mail()函数的$additional_parameters参数传递。因此我调用:
mail($to, $subject, $message, $headers, "-f address.where.i.want.the.bounces@xy.com");

根据http://www.php.net/manual/en/function.mail.php上的一些评论,托管环境会有不同的反应和限制(地址可能需要在相同的托管帐户中注册,或位于相同的域中,与标题中的“来自:”相同...等等)

我得到了弹回邮件的页面(似乎没有任何提到的限制),它托管在Domainfactory http://www.df.eu


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接