11

如何检查在我的服务器上发送的邮件是否存在问题?我运行一个简单的测试:

if(mail($to, $subject, $message)) {
echo 'Mail Sent';
}

测试输出的文本;但是,没有邮件到达。

我该如何追踪问题?

4

6 回答 6

13

这是一个很长的故事。几个要点(假设 mail() 返回 true 并且错误日志中没有错误):

  • 发件人地址(“发件人”)是否属于您服务器上的域?如果没有,那就这样吧。
  • 您的服务器是否在黑名单上(例如在 spamhaus.org 上检查 IP)?对于共享主机来说,这是一种遥远的可能性。
  • 邮件是否被垃圾邮件过滤器过滤?使用具有垃圾邮件文件夹的免费邮件程序打开一个帐户并找出答案。此外,请尝试将邮件发送到没有垃圾邮件过滤器的地址。
  • 您是否可能需要 mail() 的第五个参数“-f”来添加发件人地址?(参见 PHP 手册中的 mail() 命令)
  • 如果您有权访问日志文件,请按照上面的建议检查这些文件。
  • 您是否检查“发件人:”地址是否有可能的退回邮件(“退回给发件人”)?您还可以设置一个单独的“出错地址”。

对于讲德语的人,我前段时间就这个问题写了一篇相当详尽的“做什么”。见这里

于 2009-11-01T19:24:59.687 回答
4

跟随 Myles,如果您使用的是 Linux 机器,请在命令行上执行此操作:

# echo “Body text.” | mail -s “Hello world” you@example.com

如果您没有收到该电子邮件,则说明该邮箱的邮件系统存在问题。这与您提出的 PHP 问题不同。

于 2009-11-01T19:42:27.810 回答
3

来自 PHP 手册:

Return Values

Returns TRUE if the mail was successfully accepted for delivery, FALSE otherwise.

It is important to note that just because the mail was accepted for delivery, **it 
does NOT mean the mail will actually reach the intended destination**.

不知道如何采取下一步,但这是重要的一点。

于 2009-11-01T19:19:36.873 回答
2

如果所有故障排除失败 - 现在假设 mail() 由于未知原因返回 false - 切换到像PHPMailer这样的邮件脚本,它允许您完全绕过 mail() 并直接通过 SMTP 连接,并提供广泛的调试模式。这样,您应该能够建立一个可行的解决方案或找到问题的核心。

于 2009-11-01T22:58:04.097 回答
1

我首先要开始的是 PHP 错误日志,然后是您的 sendmail 日志。还可以从命令行尝试 sendmail 并检查 PHP 配置以确保正确设置以发送邮件。

于 2009-11-01T19:23:23.903 回答
1

您是在这里使用实时网络服务器,还是更多类似于个人开发沙箱的东西?(例如,您的家用机器?)如果是后者,我可以告诉您,过去我的 ISP (Cox) 过滤出站邮件端口时遇到了很多问题。(他们会告诉你他们不会那样做,但我敢肯定他们会这样做。)

我还收到了一些出站消息,这些消息确实通过了在 Cox 邮件假脱机中被捕获了好几天,然后才交付给我。

我希望这会有所帮助。

于 2011-01-26T02:45:26.660 回答