如何捕获mail()引起的错误?

时间:2010-02-24 03:20:24

标签: php email

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

由于电子邮件服务器故障导致的错误如下:

  

<! - 2010-02-24T14:26:43 + 11:00注意(5):意外错误:mail()[< a href ='function.mail'> function.mail< / a>]:无法连接到“ip”端口portip的邮件服务器,验证php.ini中的“SMTP”和“smtp_port”设置或使用ini_set()(#2)。
  2010-02-24 14:26:43
  用户名:admin
  文件D的第439行出错:\ test.php
  脚本:/comeromer.php
   [全局错误处理程序]
   - >

5 个答案:

答案 0 :(得分:44)

这是你能做的最好的事情:

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 :(得分:6)

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

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

答案 2 :(得分:5)

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

似乎只使用了正确的邮件,如上所述。

答案 3 :(得分:2)

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

print_r(error_get_last());

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

答案 4 :(得分:1)

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

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

您可以找到示例here