今天我发现我的网站联系表单在我的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 ?)