捕获PHP mail()错误并显示合理的用户错误消息

10

我正在编写一个相当简单的注册php脚本,它使用PHP内置的mail()函数向用户发送激活链接。

问题在于,虽然我可以捕捉普通错误,例如电子邮件格式,但一旦它发送到服务器并且用户输入的电子邮件地址失败,我不知道如何捕捉此错误并告诉用户发生了什么。

例如,目前我得到了这个:

警告:mail() [function.mail]:SMTP服务器响应:554:
:收件人地址被拒绝:中继访问被拒绝 ** 的第70行

有什么想法可以解决这类错误吗?我知道可以使用@符号来抑制错误,但我希望做更多的工作来处理这个问题。

4个回答

21

使用布尔结果来检测错误:

$success = @mail(...);

然后你想找出引起问题的内部错误,所以使用:

$error = error_get_last();
preg_match("/\d+/", $error["message"], $error);
switch ($error[0]) {
    case 554:
        ...
    default:
        ...

请注意,此方法仅适用于 PHP 5.2 及以上版本。

使用 PHP 无法验证邮件是否已传送成功或查看传输错误的电子邮件。您需要一个 pop3 轮询处理程序来解决这个问题。


1

0

在发送邮件之前,您希望尽可能地捕获所有内容,请对输入进行清理以确保它确实是您所期望的内容。

您可以使用filter_var来检查电子邮件地址是否真的是一个地址, 检查整数是否落在允许范围内等。

将邮件头部地址设置为一个您可以检查失败交付的地方:

$headers = 'From: webmaster@example.com' . "\r\n";

您还可以检查邮件是否按预期执行:

if(mail($to,$subject,$message))

最后一件事,您可能不想在实时环境中显示警告信息,您可以通过 ini 文件或使用 ini_set 关闭它们。


有一些真实的事情,但并不是问题的答案。还有一些可能会导致SMTP错误的事情,你事先无法知道。例如垃圾邮件拦截列表。 - The Surrican

-2
最好使用像 Swift Mailer 这样的库,它会抛出易于处理的异常。

4
这是解决问题的方法,但不是告诉你如何自己解决问题的答案。现在几乎有关于任何事情的库可用,当然它们可以节省很多工作量。但遗憾的是,看到人们失去解决基本问题的能力,因为他们已经不再了解所使用的编程语言的基础知识。 - The Surrican
没错,这不是问题的答案,但它提出了一种更加实用的解决问题的方式。 - Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接