通过邮件发送邮件时延迟20秒()Apache+PHP5.3+sendmail


20 Sec Delay when sending email through mail() Apache+PHP5.3+sendmail?

今天我发现我的网站联系表单在我的Godaddy Centos VPS服务器上发送电子邮件大约需要20秒。

我调查了这个问题,发现源码是由PHP的mail()函数引起的。当我在我的网站联系人页面上输入消息并点击发送按钮时,页面加载完成需要大约20秒。

用以下PHP代码创建一个test. PHP文件来测试邮件:

<?php
mail("myemail@mydomain.com", "Test", "Test");
?>

我在服务器上运行命令:php test.php

我检查了/var/log/maillog,邮件似乎是立即发送的,没有任何延迟。

20秒的延迟只发生在我通过我的网站执行代码时。我认为这与Apache用户有关,因为使用root用户的命令行可以毫无延迟地发送电子邮件。

以下是我使用root用户通过控制台发送电子邮件时的邮件日志:

Apr 10 14:57:04 ip-103-1-173-250 sendmail[27681]: r3ALv4i3027681: from=root, size=174, class=0, nrcpts=1, msgid=<201304102157.r3ALv4i3027681@ip-103-1-173-250.ip.secureserver.net>, relay=root@localhost
Apr 10 14:57:05 ip-103-1-173-250 sendmail[27681]: r3ALv4i3027681: to=john23157@gmail.com, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30174, relay=myserver, dsn=2.0.0, stat=Sent (Accepted message qp 20459 bytes 684)

出于安全考虑,本文中我将relay=值替换为myserver

从上面的邮件日志中可以看出,这封邮件是立即发送的,我确实收到了这封邮件。

这是我通过我的网站联系表单发送邮件的日志:

Apr 10 14:54:22 myhostname sendmail[27655]: r3ALsMjV027655: from=support@mydomain.com, size=940, class=0, nrcpts=1, msgid=<d946feca6d6640910e2db02d541aa704@mydomain.com>, relay=apache@localhost
Apr 10 14:57:56 myhostname sendmail[27655]: r3ALsMjV027655: to=john23157@gmail.com, ctladdr=support@mydomain.com (48/48), delay=00:03:34, xdelay=00:03:34, mailer=relay, pri=30940, relay=myserver, dsn=2.0.0, stat=Sent (Accepted message qp 21186 bytes 1297)

以上邮件日志显示延迟3分半。

我不知道是什么原因导致延迟通过Apache发送。

感谢您的帮助。

谢谢

正如@hek2mgl所说,不幸的是,大多数这样的事情都是由网络问题引起的——链中的一个邮件服务器可能不堪重负,或者网络的某些部分可能在那时很慢。在开发自己的PHP应用程序时,我也遇到过类似的问题。

既然你有自己的VPS,我建议你安装自己的SMTP服务器。我用的是PostFix,但也有其他的。然后对其进行配置,使其取代unix内置的sendmail命令。你可以在CentOS Wiki

找到如何安装后缀的说明。

如果设置正确,从PHP调用mail()将把消息添加到Postfix中的发送队列中,而不是尝试联系外部邮件服务器。它会立即返回(意味着你的应用程序会感觉快得多),而Postfix会继续尝试在后台发送电子邮件,只要它需要。

我在专家交流中找到了这个解决方案,它为我解决了这个问题。

—粘贴在—

我的问题是Sendmail寻找一个完全限定的域(FQDN)名称,而我的hosts文件中没有。有一次我把它改成了:

127.0.0.1 localhost

127.0.1.1网络服务器

:

127.0.0.1 localhost localhost。localdomain网络服务器

我跟你打赌这不是PHP的mail()函数造成的

mail()函数是exec调用的简单包装器,exec调用MTA的CLI接口。简单地执行一个程序不太可能有这样的延迟——每次我遇到这个问题,都是由于MTA试图同步卸载消息并在此过程中遇到问题(配置不良的DNS,缺少智能主机,识别查找....)。

因为它是一个VPS,你可以控制MTA是如何配置的。这是ServerFault的主题,而不是Stackoverflow的主题。

(顺便说一句,你检查配置是相同的CLI和web服务器SAPI?)是否尝试从 webserver sapi执行CLI ?)