我在服务器上制作了一个快速的PHP脚本,其中包含对mail()函数的调用,并开始进行测试。HTML页面总是立即加载,因此我认为这意味着包含对mail()函数调用的PHP已经执行完成。然而,从mail()函数发送的电子邮件只有在调用后10-20分钟才能被接收到。为什么会有延迟?mail()函数是否触发外部程序?(如果相关,请注意:这些电子邮件将被发送到Gmail电子邮件账户)
我在服务器上制作了一个快速的PHP脚本,其中包含对mail()函数的调用,并开始进行测试。HTML页面总是立即加载,因此我认为这意味着包含对mail()函数调用的PHP已经执行完成。然而,从mail()函数发送的电子邮件只有在调用后10-20分钟才能被接收到。为什么会有延迟?mail()函数是否触发外部程序?(如果相关,请注意:这些电子邮件将被发送到Gmail电子邮件账户)
您所看到的行为与PHP的mail()
函数无关。相反,这是PHP交付消息的SMTP邮件服务器需要时间来传递。该服务被称为邮件传输代理或MTA。
有很多潜在原因可能导致邮件无法立即送达。可能,您看到的延迟是由于接收服务器上的灰名单,这意味着接收邮件服务器拒绝接受邮件,直到发送服务器(即您的PHP脚本交付的服务器)尝试重新发送几次。表现良好的MTA会重试发送失败的尝试,但垃圾邮件服务器通常不会这样做,因此这是一种简单而有效的方法来减少垃圾邮件。
甚至可能只是SMTP服务器上长队等待发送的邮件,您的邮件也在排队等待。(但实际上更可能是灰名单)
最重要的是要记住,电子邮件不是旨在即时传递信息的,因此无法保证即时传递。在过去的十年左右,我们已经习惯了电子邮件的快速交付,但您永远不能承诺快速交付。
正如@Michael Berkowski所说,问题不在于mail()函数本身。mail()函数通过调用您的系统内置的SMTP邮递员软件来工作。然后它通过执行必要的DNS查找以查找正确的邮件服务器自动协商与接收系统的对话。然后该服务器接收您的消息,通过灰名单和反向DNS查找检查您的系统、扫描它并将其与自己的垃圾邮件/病毒保护运行,最后交付邮件。此外,许多邮件服务器会延迟未知发送服务器,以防止邮件DOS攻击和钓鱼。
My unqualified host name (devserver) unknown; sleeping for retry
127.0.0.1 localhost.localdomain localhost devserver
127.0.1.1 devserver
mail()
函数无关。实际上,是 SMTP 邮件传递(由 PHP 交付消息)需要时间。可能你看到的延迟是接收服务器上的灰名单,这意味着接收邮件服务器拒绝接受消息,直到发送服务器(即你的 PHP 脚本所在的服务器)尝试了几次为止。 - Michael Berkowski