我正在编写一个相当简单的注册PHP脚本,该脚本使用PHP内置的mail()
函数向用户发送激活链接。
问题是我可以捕获正常的错误,例如电子邮件格式化,但一旦它触发到服务器并说用户已经输入失败的电子邮件地址,我不知道如何捕获此错误并告诉用户发生了什么。
例如,目前我得到了这个:
警告:mail()[function.mail]:SMTP服务器响应:554 :收件人地址被拒绝:中继访问 在第70行的 ** 中被拒绝
关于这样的错误,我能做些什么?我知道使用@符号来抑制错误,但我有点想做更多的事情并处理这个问题。
答案 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这样的库来抛出易于处理的异常。