10

我在我的服务器上制作了一个快速的 PHP 脚本,其中包含对 mail() 的调用并开始测试它。html 页面总是立即加载,所以我认为这意味着包含对 mail() 的调用的 PHP 已完成执行。但是,从 mail() 发送的电子邮件只会在通话后每 10-20 分钟收到一次。为什么延迟?mail() 会触发外部程序吗?(如果相关,电子邮件将发送到 gmail 电子邮件帐户)

4

3 回答 3

21

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

无法立即交付的潜在原因有很多。您看到的延迟可能是接收服务器上的灰名单,这意味着接收邮件服务器拒绝接受该邮件,直到发送服务器(您的 PHP 脚本将其交给该服务器)尝试几次重新发送它。表现良好的 MTA 将重试失败的发送尝试,但垃圾邮件服务器通常不会,这使其成为减少垃圾邮件的简单但有效的方法。

它甚至可以像 SMTP 服务器上等待发送的一长串消息一样简单,而您的消息正在排队等待。(虽然真的灰名单更有可能)

但最重要的是要记住,电子邮件并不是即时的,因此永远不能保证是即时的。在过去十年左右的时间里,我们大体上已经习惯了电子邮件的快速交付,但您永远不能保证快速交付。

于 2013-08-20T00:51:07.427 回答
10

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

于 2013-08-20T00:51:53.220 回答
0

今天我正在设置我的本地开发服务器并且遇到了同样的问题。通过 mail() 函数从 php 发送邮件非常慢。如前所述,问题在于 sendmail-setup (/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

tldr; 编辑 /etc/hosts

127.0.0.1       localhost.localdomain localhost devserver
127.0.1.1       devserver

也许它也会帮助某人

于 2022-02-01T11:48:47.417 回答