【发布时间】:2011-01-20 09:01:09
【问题描述】:
有谁知道如何在php中捕获邮件错误(发送电子邮件时显示错误,错误是由邮件服务器关闭引起的)?
邮件服务器宕机导致的错误如下:
【问题讨论】:
-
如何发送邮件?您是直接与 SMTP 服务器通话吗?
有谁知道如何在php中捕获邮件错误(发送电子邮件时显示错误,错误是由邮件服务器关闭引起的)?
邮件服务器宕机导致的错误如下:
【问题讨论】:
这是你能做的最好的:
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) 按照fire 和Mike 的建议,使用不同的邮件程序。
如果mail() 变得过于脆弱和不灵活,我会考虑 b)。关闭错误会使调试变得更加困难,而且通常不好。
【讨论】:
mail() 返回一个bool。很好,您也引用了“如果没有错误,邮件到达”的假设,因为这也是新开发人员中常见的误解。
PHPMailer 可以很好地处理错误,也是通过 SMTP 发送邮件的好脚本...
if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
【讨论】:
同样使用http://php.net/error_get_last 也无济于事,因为 mail() 不会将其错误发送到此函数中。
唯一的方法似乎是使用合适的邮件,就像上面已经建议的那样。
【讨论】:
mail 为我返回 false 但 error_get_last 为空。
根据http://php.net/manual/en/function.error-get-last.php,使用:
print_r(error_get_last());
这将返回最后生成的错误的数组。您可以访问[message] 元素来显示错误。
【讨论】: