PHP的mail()函数为什么如此缓慢?

12

我在服务器上制作了一个快速的PHP脚本,其中包含对mail()函数的调用,并开始进行测试。HTML页面总是立即加载,因此我认为这意味着包含对mail()函数调用的PHP已经执行完成。然而,从mail()函数发送的电子邮件只有在调用后10-20分钟才能被接收到。为什么会有延迟?mail()函数是否触发外部程序?(如果相关,请注意:这些电子邮件将被发送到Gmail电子邮件账户)


2
这与 mail() 函数无关。实际上,是 SMTP 邮件传递(由 PHP 交付消息)需要时间。可能你看到的延迟是接收服务器上的灰名单,这意味着接收邮件服务器拒绝接受消息,直到发送服务器(即你的 PHP 脚本所在的服务器)尝试了几次为止。 - Michael Berkowski
1
@MichaelBerkowski 应该是一个答案,我个人认为。 - thejh
@user2593666 不,这完全不在你的掌控之中。它取决于至少两个,但通常是多个服务器的操作,这些服务器不受你的控制,当然也不受 PHP 的控制。 - Michael Berkowski
@MichaelBerkowski,我在本地服务器上也遇到了同样的问题。我想当我转移到一个拥有适当域名的WWW服务器时,Gmail更可能接受我的请求,对吗? - Anshu Dwibhashi
你也可以尝试与Spamhaus和你的ISP交谈,他们往往会执行大部分灰名单和电子邮件发送限制。 - CP510
显示剩余3条评论
3个回答

21

您所看到的行为与PHP的mail()函数无关。相反,这是PHP交付消息的SMTP邮件服务器需要时间来传递。该服务被称为邮件传输代理或MTA

有很多潜在原因可能导致邮件无法立即送达。可能,您看到的延迟是由于接收服务器上的灰名单,这意味着接收邮件服务器拒绝接受邮件,直到发送服务器(即您的PHP脚本交付的服务器)尝试重新发送几次。表现良好的MTA会重试发送失败的尝试,但垃圾邮件服务器通常不会这样做,因此这是一种简单而有效的方法来减少垃圾邮件。

甚至可能只是SMTP服务器上长队等待发送的邮件,您的邮件也在排队等待。(但实际上更可能是灰名单)

最重要的是要记住,电子邮件是旨在即时传递信息的,因此无法保证即时传递。在过去的十年左右,我们已经习惯了电子邮件的快速交付,但您永远不能承诺快速交付。


谢谢,如果不是原帖作者,你帮了我。 - Anshu Dwibhashi

10

正如@Michael Berkowski所说,问题不在于mail()函数本身。mail()函数通过调用您的系统内置的SMTP邮递员软件来工作。然后它通过执行必要的DNS查找以查找正确的邮件服务器自动协商与接收系统的对话。然后该服务器接收您的消息,通过灰名单和反向DNS查找检查您的系统、扫描它并将其与自己的垃圾邮件/病毒保护运行,最后交付邮件。此外,许多邮件服务器会延迟未知发送服务器,以防止邮件DOS攻击和钓鱼。


与@MichaelBerkowski的答案相比,这里有一些新信息。非常感谢,谢谢! - user2593666
我和他同时在写答案,哈哈。他的只是评论,而我想提供一些背景信息,因为我编写过邮件服务器。 - CP510

2
今天我在设置本地开发服务器时遇到了同样的问题。通过mail()-函数发送邮件非常慢。正如先前提到的,这个问题出现在sendmail的设置上(/var/log/mail.log):
My unqualified host name (devserver) unknown; sleeping for retry

我需要按照以下指南使我的主机名可解析:https://linuxconfig.org/sendmail-unqualified-hostname-unknown-sleeping-for-retry-unqualified-hostname
简而言之,编辑/etc/hosts文件即可。
127.0.0.1       localhost.localdomain localhost devserver
127.0.1.1       devserver

也许这对其他人也有所帮助,特此分享。

非常感谢您提供这个完美的答案。我遇到了同样的问题,现在我对它有了更多的了解,并且能够解决它。非常好的链接! - coldgas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接