mail()失败,但返回true


mail() fails, but returns true

我正在尝试在服务器上使用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!";

造成这个问题的原因有很多。以下是一些:

  1. 邮件已收到,但被标记为垃圾邮件
  2. 收件人的地址不正确
  3. 发送邮件服务器上有一个慢速邮件队列
  4. 接收邮件的服务器上有一个缓慢的邮件队列

当传出邮件服务器接受要传递的消息时,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地址解决了问题。