是啥让 PHP 的 mail() 函数这么慢?
Posted
技术标签:
【中文标题】是啥让 PHP 的 mail() 函数这么慢?【英文标题】:What makes PHP's mail() function so slow?是什么让 PHP 的 mail() 函数这么慢? 【发布时间】:2013-08-21 22:14:40 【问题描述】:我在我的服务器上创建了一个快速的 php 脚本,其中包含对 mail() 的调用并开始测试它。 html 页面总是立即加载,所以我认为这意味着包含对 mail() 的调用的 PHP 已完成执行。但是,从 mail() 发送的电子邮件只会在通话后每 10-20 分钟收到一次。为什么延迟? mail() 会触发外部程序吗? (如果相关,电子邮件将发送到 gmail 电子邮件帐户)
【问题讨论】:
这与mail()
无关。需要时间的是 SMTP 邮件传递(PHP 将消息交给它)。您看到的延迟可能是接收服务器上的灰名单,这意味着接收邮件服务器拒绝接受邮件,直到发送服务器(您的 PHP 脚本将其交给该服务器)尝试几次。
@MichaelBerkowski 应该是 IMO 的答案。
@thejh 我会转换它。
有什么方法可以加快将电子邮件即时放置在收件人收件箱中的过程?
@user2593666 不,这完全不在你的掌控之中。这取决于至少两个,但通常是两个以上不受您控制的服务器的操作,当然也不受 PHP 的控制。
【参考方案1】:
您看到的行为与 PHP 的 mail()
函数无关。相反,PHP 将消息交给 SMTP 邮件服务器,这需要时间来传递。该服务称为a mail transport agent, or MTA。
无法立即交付的潜在原因有很多。可能,您在接收服务器上看到的延迟为greylisting,这意味着接收邮件服务器拒绝接受该邮件,直到发送服务器(您的 PHP 脚本将其交给该服务器)尝试几次重新发送它。表现良好的 MTA 会重试失败的发送尝试,但垃圾邮件服务器通常不会,因此这是一种简单而有效的减少垃圾邮件的方法。
它甚至可以像 SMTP 服务器上等待发送的一长串消息一样简单,而您的消息正在排队等待。 (实际上,灰名单更有可能)
最重要的是要记住,电子邮件并非旨在即时发送,因此永远不能保证是即时发送的。在过去十年左右的时间里,我们大体上已经习惯了电子邮件的快速送达,但您永远不能保证快速送达。
【讨论】:
谢谢,如果不是 OP 帮助我【参考方案2】:正如@Michael Berkowski 所说,这不是 mail() 函数本身。 mail() 通过调用内置于 SMTP 快递软件的系统来工作。然后,它通过执行必要的 DNS 查找来自动与接收系统协商对话,以找到合适的邮件服务器。然后该服务器接收您的消息,通过灰名单和反向 DNS 查找检查您的系统,扫描它并针对它自己的垃圾邮件/病毒防护运行它,然后最终交付。还有很多邮件服务器会延迟未知的发送服务器,以防止邮件被DOS和钓鱼。
【讨论】:
与@MichaelBerkowski 的答案相比,这有一些新信息。非常感谢,谢谢! 我和他同时写了我的答案。哈哈。他只是一个评论,我想我应该填写一些背景信息,因为我已经编写了一个邮件服务器。以上是关于是啥让 PHP 的 mail() 函数这么慢?的主要内容,如果未能解决你的问题,请参考以下文章