如何知道PHP邮件是否失败


how to know if php mail failed

我正在从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 mail不存在,但是没有显示failed !!

邮件方法只是发送邮件。如果它没有收到任何错误(例如,没有找到服务器等),它将成功返回。您将无法知道邮件是否实际降落在收件人的收件箱中,除非您创建一些代码围绕被退回的电子邮件等。

我认为您需要检查的是真实的电子邮件,而不仅仅是有效的格式化电子邮件。所以我建议大家看看这个博客

检查mail的返回

返回TRUE,如果邮件被成功接收,返回FALSE否则。

重要的是要注意,仅仅因为邮件被接受了这并不意味着邮件真的会到达预定的地方目的地。

虽然它返回true可能意味着你的邮件程序正在接受消息,但是当它试图发送给任何人时失败了…

您应该通过验证器运行$to以检查其有效地址,然后抛出错误,如果不是,不要依赖mail()来过滤掉您已经知道是错误的东西,或者可以轻松检查。

——更新

然后检查@SeRPRo,但是你要做的是很难用编程测试-发送一封需要用户点击链接来验证它是真实的电子邮件比尝试查询SMTP服务器更容易和更可靠,它们都有不同的行为(阅读:被破坏到不同程度)。还要注意,您的预期行为(代码方面)很难与垃圾邮件发送者区分开来,因此,如果您避免验证电子邮件路由,则很难发现这一点,请不要感到惊讶。

虽然$to mail不存在,但是没有显示failed !!

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

您可以自己抄送,作为测试它是否离开发件箱的一种方式。

在我的例子中,它有助于通过命令行参数"-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上的一些评论,托管环境的反应不同,有不同的限制(地址可能需要在同一个托管帐户中注册,或者在同一个域中,与标题中的"From:"相同…等等)

我收到反弹的页面(似乎没有提到的限制)托管在Domainfactory http://www.df.eu

使用phpmailer发送邮件,并设置$mail->AddCustomHeader('Return-path:bounce@mail.com');如果收件人邮件id不存在或收件人没有收到任何其他情况下的电子邮件,这将在bounce@mail.com发送弹跳电子邮件。