今天我发现我的网站联系表格大约需要20秒才能在我的Godaddy Centos VPS服务器上发送电子邮件。
我调查了这个问题,发现源是由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
。
从上面的maillog中可以看出,电子邮件已经立即发送,我收到了电子邮件。
当我通过我的网站联系表单发送时,这是邮件日志:
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)
上述maillog显示延迟3分半。
我不知道在通过Apache发送时导致延迟的原因。
非常感谢您的帮助。
由于
答案 0 :(得分:1)
正如@ hek2mgl所说的那样,遗憾的是大多数此类事情都是由网络问题引起的 - 链中的一个邮件服务器可能会不堪重负,或者网络的某些部分可能在这一点上很慢。当我开发自己的PHP应用程序时,我遇到了类似的问题。
由于您拥有自己的VPS,我建议您安装自己的SMTP服务器。我使用PostFix,但还有其他人。然后配置它以替换内置的unix sendmail
命令。您可以找到instructions on how to install postfix at the CentOS Wiki
如果设置正确,从PHP调用mail()
会将消息添加到Postfix中的发送队列,而不是尝试联系外部邮件服务器。它将立即返回(意味着您的应用程序将感觉更快),而Postfix将继续尝试在后台发送电子邮件,只要它需要。
答案 1 :(得分:0)
我在专家交流中找到了这个解决方案,它为我解决了这个问题。
---粘贴在--- ---
我的问题是Sendmail查找完全限定域名(FQDN)名称,这是我在hosts文件中没有的名称。一旦我改变了它:
127.0.0.1 localhost
127.0.1.1 webserver
到此:
127.0.0.1 localhost localhost.localdomain webserver
答案 2 :(得分:-1)
我敢打赌你的周工资不是由PHP的mail()函数引起的。
mail()函数是一个exec调用的简单包装器,它调用CLI接口到MTA。简单地执行一个程序不太可能有这样的延迟 - 每次我遇到这个问题都是因为MTA试图同步卸载消息并在此过程中遇到问题(配置错误的DNS,缺少智能主机) ,ident lookups ....)。
由于它是VPS,因此您可以控制MTA的配置方式(错误)。这是ServerFault的主题 - 而不是Stackoverflow。
(BTW您是否检查过CLI和Web服务器SAPI的配置是否相同?您是否尝试从网络服务器sapi执行CLI ?)