使用PHP处理邮件失败?

时间:2011-01-17 10:41:38

标签: php email email-validation

如果我通过GMail向此地址发送电子邮件nkhkhlkhlkjlkjkljlkjlk@gmail.com

我得到的错误如下:

  

交付给以下收件人永久失败

我的问题是,如果我使用PHP mail函数发送,我该如何捕获退回电子邮件?

我的代码:

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

$to = "nkhkhlkhlkjlkjkljlkjlk@gmail.com";
$subject = "Testing";
$message = "Testing body";

mail($to, $subject, $message, $headers); 

6 个答案:

答案 0 :(得分:2)

您可以在使用此邮件时通过邮件获取邮件:

$bounce = 'test@domian.com';
mail($to, $subject, $message, $headers,"-f $bounce");

这会将所有退回邮件发送到您的地址

答案 1 :(得分:2)

仅使用mail()无法检测到此类错误。您必须指定有效的返回地址,然后连接到该邮箱(通过IMAP或POP,有相应的功能)并检查是否有任何消息被退回。请记住,反弹可能需要很长时间(即使是几小时,由于瞬态错误),因此您必须异步执行此检查。

答案 2 :(得分:1)

您可以使用PEAR MAil,它包含parseAddressList()方法,用于检查电子邮件地址的服务器是否接受电子邮件地址。它还会返回有用的错误消息。

答案 3 :(得分:1)

PHP mail()函数确实有一个错误状态作为函数返回值,但它不会发现这种错误,因为它只检查电子邮件是否已发送,而不是已收到

(这是因为它需要立即将控制权返还给程序;它不能等待可能的退回邮件,因为它们可能需要很长时间才能回来 - 您不希望程序等待为了防止电子邮件被弹回五天,你会吗?)

因此,确定邮件是否已退回的唯一方法是使用单独的程序检查邮箱将被发送到哪个邮箱。

您可以使用邮件选项字符串中的-f选项指定退回邮箱(有关详细信息,请参阅the PHP mail() function man page)。

然后让一个单独的程序定期检查该邮箱是否有退回邮件,并根据需要向您报告。 (有许多PHP库可以让你检查邮箱;谷歌会在这里提供帮助,或者查看PEAR)

确定它的电子邮件取决于退回邮件的质量。您绝对应该能够看到预期收件人的电子邮件地址,但您可能无法分辨它是哪个电子邮件,即将其与您在首先调用mail()功能时的特定实例进行匹配

希望有所帮助。

答案 4 :(得分:1)

您应该通过IMAP或POP3登录收件箱并解析电子邮件地址和投放错误。

还值得一提的是,您可以指定(发送时)自定义标头以更好地跟踪消息来源,我相信MailChimp和其他人这样做会跟踪广告系列等...

答案 5 :(得分:0)

PHP离开邮件功能后对邮件一无所知,所以在发送邮件的同时无法做到这一点。