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

时间:2011-02-06 14:19:27

标签: php

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

问题是我可以捕获正常的错误,例如电子邮件格式化,但一旦它触发到服务器并说用户已经输入失败的电子邮件地址,我不知道如何捕获此错误并告诉用户发生了什么。

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

  

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

关于这样的错误,我能做些什么?我知道使用@符号来抑制错误,但我有点想做更多的事情并处理这个问题。

4 个答案:

答案 0 :(得分: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 :(得分:1)

我遭受的一个微不足道的错误,就是我的系统中缺少“sendmail”。 最后,我安装了 exim4 并对其进行了配置 - 然后php的邮件(...)工作正常。

另见:

答案 2 :(得分:0)

您希望在发送邮件之前尽可能多地捕获,清理您的输入,以确保它真的是您期望的那样

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

将邮件标题从地址设置到您可以检查送货失败的地方:

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

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

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

最后,你可能不想在实时环境中display warnings,你可以通过ini文件或使用ini_set关闭它们。

答案 3 :(得分:-2)

最好是使用像Swift Mailer这样的库来抛出易于处理的异常。