2011-02-06 53 views
9

我正在编写一个相当简单的注册php脚本,它使用PHP内置的mail()函数向用户发送激活链接。捕获PHP邮件()错误并显示合理的用户错误消息

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

例如在现阶段,我得到这个:

Warning: mail() [function.mail]: SMTP server response: 554 : Recipient address rejected: Relay access denied in ** on line 70

任何想法我能做些像这样的错误?我知道使用@符号来压制这个错误,但我有点想做更多的事情并处理这个问题。

回答

21

使用布尔结果检测错误:

$success = @mail(...); 

那么你一定要找出哪些内部错误导致的问题,所以使用:

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

注意这与PHP 5.2仅限于此。

无法验证交付或使用PHP查看运输错误邮件。你需要一个pop3轮询处理程序。

0

你想捕捉尽可能多的,你可以在发送之前关闭邮件,净化你的投入,以确保它确实是你希望它是

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

从地址邮件头设置到一个地方,你可以检查传送失败:

$headers = 'From: [email protected]' . "\r\n"; 

您可以阿尔斯o检查预期执行的邮件:

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

而且最后的事情,你可能不希望display warnings在实际环境中,你可以关闭它们,或者通过ini文件或使用ini_set

+0

真实的东西,但不是一个问题的答案。也有可能会导致smtp错误的事情,而这些错误事先不能提供。例如垃圾邮件拦截列表。 – 2011-02-06 14:52:17

-2

最好的办法就是使用像Swift Mailer这样的库,它引发可轻松处理的异常。

+4

这是一个治愈问题,但不是一个答案如何自己解决它。现在几乎所有的图书馆都可以使用,当然他们可以安全地做大量的工作。但是很遗憾看到人们失去了解决基本问题的能力,因为他们只是不了解他们所使用的编程语言的基础知识。 – 2011-02-06 14:53:57

+0

没错,这不是问题的答案,而是它提出了一种解决方法这个问题更务实。 – Jan 2011-02-06 14:59:47