我正在尝试在服务器上使用php mail()
函数。奇怪的是,它是真的,但我的电子邮件收件箱里没有收到任何东西。
然而,cpanel的电子邮件转发器运行良好。
既然货运代理给我发了电子邮件,那么这不是一个配置问题吗?
我尝试添加:
ini_set("sendmail_from", "do-not-reply@gmail.com");
但这并没有奏效。
这是我的代码:
$subject = "My Subject";
$body = "Email Body ";
$headers = 'From: do-not-reply@domain.com' . "'r'n" .
'Reply-To: do-not-reply@domain.com' . "'r'n" .
'X-Mailer: PHP/' . phpversion();
if (mail($email,$subject,$body,$headers))
echo "Sent!";
else
echo "Fail!";
造成这个问题的原因有很多。以下是一些:
- 邮件已收到,但被标记为垃圾邮件
- 收件人的地址不正确
- 发送邮件服务器上有一个慢速邮件队列
- 接收邮件的服务器上有一个缓慢的邮件队列
当传出邮件服务器接受要传递的消息时,mail()
返回true。您需要对其他可能性进行故障排除,以找到故障点。
mail()
函数很少返回true
以外的任何内容。它只关心它是否成功地将电子邮件发送给了MTA(邮件传输代理,即实际发送电子邮件的程序)。
MTA只有在电子邮件格式不正确的情况下才会立即拒绝。在这种情况下,您将在PHP中得到一个错误。但它也可以拒绝电子邮件,或者在从PHP接受电子邮件后无法发送,原因多种多样,PHP对此一无所知,因为它已经收到了true
响应。
MTA将有一个错误日志,如果错误发生在本地,您可以检查该日志以获取详细信息。
我使用的脚本在同一域发送和接收时遇到了这个问题。您是否尝试将电子邮件发送到位于其他域的电子邮件地址?这可能有助于缩小可能出现的问题。
我们面临着完全相同的问题。解决方案是在php.ini中设置相应的sendmail_path。
sendmail_path="/usr/sbin/sendmail-t-i"
设置以上内容解决了问题。
发送测试电子邮件后检查您的mail.log:
sudo tail -f /var/log/mail.log
然后,您可以看到分配给您尝试发送的最后一封电子邮件的ID。例如,我看到:
Jan 11 23:03:14 vagrant-ubuntu-trusty-64 postfix/pickup[17228]: 69F3441529: uid=33 from=<www-data>
69F3441529是分配给该电子邮件的唯一id。然后,您可以为所有具有该ID的行grep日志…
sudo grep 69F3441529 /var/log/mail.log
然后,您应该能够发现可能存在的任何错误消息,然后用谷歌搜索它们:)
在我的案例中,将服务器设置从IPv6地址更改为IPv4地址解决了问题。