【问题标题】:How can I catch an error caused by mail()?如何捕获由 mail() 引起的错误?
【发布时间】:2011-01-20 09:01:09
【问题描述】:

有谁知道如何在php中捕获邮件错误(发送电子邮件时显示错误,错误是由邮件服务器关闭引起的)?

邮件服务器宕机导致的错误如下:

【问题讨论】:

  • 如何发送邮件?您是直接与 SMTP 服务器通话吗?

标签: php email


【解决方案1】:

这是你能做的最好的:

if (!mail(...)) {
   // Reschedule for later try or panic appropriately!
}

http://php.net/manual/en/function.mail.php

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

请务必注意,仅仅因为邮件被接受投递,并不意味着邮件实际上会到达预定目的地。

如果需要抑制警告,可以使用:

if (!@mail(...))

在使用 @ 运算符时要小心,而无需适当检查某事是否成功。


如果mail() 错误无法抑制(很奇怪,但现在无法测试),您可以:

a) 暂时关闭错误:

$errLevel = error_reporting(E_ALL ^ E_NOTICE);  // suppress NOTICEs
mail(...);
error_reporting($errLevel);  // restore old error levels

b) 按照fireMike 的建议,使用不同的邮件程序。

如果mail() 变得过于脆弱和不灵活,我会考虑 b)。关闭错误会使调试变得更加困难,而且通常不好。

【讨论】:

  • +1 好答案。人们经常忘记mail() 返回一个bool。很好,您也引用了“如果没有错误,邮件到达”的假设,因为这也是新开发人员中常见的误解。
  • 嗨 deceze,我知道 mail() 将返回 true 或 false。但是未知原因,这总是在我的页面上显示错误消息(错误消息显示在我上面的问题中,并且只有当我从页面查看源代码时才能查看错误):并且此错误导致我无法重定向(header() )我的页面到新页面。我搜索了代码,但无法找出实际显示此错误的位置。也许这是在 php stmp 设置中设置的?
  • 我的问题是......我怎样才能从我的页面标题中忽略或抛出这个“无法连接到邮件服务器”错误消息?有人知道怎么做吗?我一直在谷歌搜索,但仍然无法找到解决方案
  • 非常感谢您为我工作。人们要注意的一件事是您正确设置了标题。 $headers = '发件人:' .$email . “\r\n”。 '回复: ' 。 $电子邮件。 "\r\n" 。 'X-Mailer: PHP/' 。 php版本();邮件($email_to, $subject, $message, $headers);
【解决方案2】:

您可以使用PEAR Mail 类和方法,它允许您通过以下方式检查错误:

if (PEAR::isError($mail)) {
    echo("<p>" . $mail->getMessage() . "</p>");
} else {
    echo("<p>Message successfully sent!</p>");
}

你可以找到一个例子here

【讨论】:

    【解决方案3】:

    PHPMailer 可以很好地处理错误,也是通过 SMTP 发送邮件的好脚本...

    if(!$mail->Send()) {
      echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
      echo "Message sent!";
    }
    

    【讨论】:

    • 其实我认为如果你没有将异常属性设置为true,它会回显一个错误
    • 我深入研究了它的代码,它只是使用临时的“安全模式”+@mail() 来处理错误。
    【解决方案4】:

    同样使用http://php.net/error_get_last 也无济于事,因为 mail() 不会将其错误发送到此函数中。

    唯一的方法似乎是使用合适的邮件,就像上面已经建议的那样。

    【讨论】:

    • 这个声明似乎有一定的价值,mail 为我返回 false 但 error_get_last 为空。
    【解决方案5】:

    根据http://php.net/manual/en/function.error-get-last.php,使用:

    print_r(error_get_last());
    

    这将返回最后生成的错误的数组。您可以访问[message] 元素来显示错误。

    【讨论】:

    • 它不是按照手册,而是按照手册中的cmets,它确实具有误导性,千万不要使用它。最后一个错误可能是代码中某处的弃用通知,这不会中断执行,尤其是在生产中,如果设置正确的话。
    猜你喜欢
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多