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

Jin*_*ong 28 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
脚本:/customer.php
[全局错误处理程序]
- >

dec*_*eze 46

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

if (!mail(...)) {
   // Reschedule for later try or panic appropriately!
}
Run Code Online (Sandbox Code Playgroud)

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

mail()TRUE如果邮件已成功接受传递,FALSE则返回,否则返回.

重要的是要注意,仅仅因为邮件被接受传递,并不意味着邮件实际上将到达预定目的地.

如果您需要禁止警告,您可以使用:

if (!@mail(...))
Run Code Online (Sandbox Code Playgroud)

但是在@没有适当检查是否成功的情况下使用操作员时要小心.


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

a)暂时关闭错误:

$errLevel = error_reporting(E_ALL ^ E_NOTICE);  // suppress NOTICEs
mail(...);
error_reporting($errLevel);  // restore old error levels
Run Code Online (Sandbox Code Playgroud)

b)使用不同的邮件程序,如火迈克所建议的那样.

如果mail()结果太脆弱且不灵活,我会研究b).关闭错误会使调试变得更加困难并且通常是不合适的.

  • +1好答案.人们常常忘记`mail()`会返回一个`bool`.很好,你引用了"如果没有错误,邮件到达"的假设,因为这也是新开发者之间的常见误解. (3认同)

fir*_*ire 6

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

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


sta*_*abm 5

使用http://php.net/error_get_last也无法帮助你,因为mail()不会将错误传递给这个函数.

唯一的方法似乎是使用正确的邮件,就像上面已经建议的那样.

  • 这个说法似乎有一些价值,`mail`为我返回false,但`error_get_last`为null. (2认同)