【问题标题】:mail() fails, but returns truemail() 失败,但返回 true
【发布时间】:2011-05-27 19:35:30
【问题描述】:

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

【问题讨论】:

  • 需要注意的一点是:“需要注意的是,仅仅因为邮件被接受投递,并不意味着邮件实际上会到达预定目的地。”
  • 检查您的 SMTP 服务器的邮件日志。它将解释为什么邮件没有被传递。
  • 当我的一些电子邮件由于某种原因被列为垃圾邮件时,我遇到了 goDaddy 共享主机问题。我不知道他们如何生成该列表,但它是完整且完全的 bs。您的服务器可能有同样的问题。在此处阅读:community.godaddy.com/groups/email/forum/topic/… - 您尝试从中发送消息的电子邮件可能存在一些问题。 “最常见的情况是,发送邮件服务器的 IP 地址可能来自公共邮件列表(例如 senderbase.org)的邮件信誉不佳”

标签: php sendmail


【解决方案1】:

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

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

mail() 在外发邮件服务器接受要传递的邮件时返回 true。您需要排除其他可能性以找到故障点。

【讨论】:

  • 正确。您可能会在几天后收到一条消息。
  • 几天后??!!,是时候转移到 sendgrid 或其他东西了
【解决方案2】:

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

MTA 只会立即拒绝格式错误的电子邮件。在这种情况下,您会在 PHP 中遇到错误。但它也可以拒绝电子邮件或在从 PHP 接受电子邮件后无法发送,原因有很多,PHP 不会知道,因为它已经收到了 true 响应。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      sendmail_path = "/usr/sbin/sendmail -t -i"

      以上设置解决了问题。

      【讨论】:

        【解决方案5】:

        发送测试电子邮件后检查您的 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。然后,您可以 grep 具有该 ID 的所有行的日志...

        sudo grep 69F3441529 /var/log/mail.log
        

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

        【讨论】:

          【解决方案6】:

          在我的例子中,将服务器设置从 IPv6 地址更改为 IPv4 地址解决了这个问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-02-10
            • 1970-01-01
            • 2022-06-10
            • 2013-06-16
            • 1970-01-01
            • 2014-07-14
            • 1970-01-01
            相关资源
            最近更新 更多