mail()失败,但返回true

时间:2011-05-27 19:35:30

标签: php sendmail

我正在尝试在我的服务器上使用php mail()功能。奇怪的是,它返回true,但我的电子邮件收件箱中没有收到任何内容。

然而,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!";

6 个答案:

答案 0 :(得分:6)

有许多原因可能导致此问题。以下是一些:

  1. 邮件已收到,但已标记为垃圾邮件。
  2. 收件人的地址不正确。
  3. 发送邮件服务器上有一个慢速邮件队列。
  4. 接收邮件服务器上有一个慢速邮件队列。
  5. 当外发邮件服务器接受要传递的邮件时,

    mail()返回true。您需要解决其他可能性以找到故障点。

答案 1 :(得分:4)

mail()函数很少返回true以外的任何内容。它只关心它成功地将电子邮件发送给MTA(邮件传输代理 - 即实际发送它的程序)这一事实。

如果电子邮件格式不正确,MTA将仅立即拒绝该电子邮件。在这种情况下,您将在PHP中收到错误。但它也可以拒绝收到电子邮件或者在PHP接受电子邮件后发送失败,原因有很多,其中PHP没有任何想法,因为它已经收到了true响应。

您的MTA将有一个错误日志,如果错误发生在本地,您可以查看更多信息。

答案 2 :(得分:1)

我遇到了这个问题,我正在使用的脚本是从同一个域发送和接收的。您是否尝试将电子邮件发送到位于其他域的电子邮件地址?这可能有助于缩小可能的问题范围。

答案 3 :(得分:1)

我们遇到了完全相同的问题。解决方案是在php.ini中设置了相应的sendmail_path。

sendmail_path =“/ usr / sbin / sendmail -t -i”

设置上述解决了问题。

答案 4 :(得分:1)

发送测试电子邮件后检查您的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

然后,您应该能够发现可能存在的任何错误消息,然后谷歌他们:)

答案 5 :(得分:0)

就我而言,将服务器设置从IPv6地址更改为IPv4地址解决了这个问题。