在我们的networking服务器上,PHP mail()命令一直挂在一些电子邮件地址上,但对大多数人来说都没问题。 它会挂起超过2分钟,届时PHP脚本已经与数据库失去连接,因此向浏览器返回错误。
我们使用sendmail,并在邮件日志( / var / log / maillog )中看到导致问题的电子邮件地址的延迟时间为2:36:
Dec 9 11:24:00 liveserver sendmail[12666]: nB9BLOHa012666: to=***blanked_out***, delay=00:02:36, mailer=esmtp, pri=31326, dsn=4.4.3, stat=queued
重现问题很容易。 我可以把我想testing的电子邮件放在以下命令中:
echo "Test message from sendmail." | sendmail [email protected] [email protected]
大多数电子邮件地址会导致命令在1秒内返回(包括无效的电子邮件地址)。 但有问题的电子邮件地址为2:36。
注意:我们目前有550个消息排队 – 但是这个数字不是正常的( find /var/spool/mqueue -type f -name qf\* -print|wc -l|tr -d ' ' )。
通常电子邮件延迟是DNS问题。
尝试运行:
host -t mx problemdomain.com
如果这似乎不是问题,请使用sendmail -bi -v获取更多debugging输出。
也许它的DNS问题,尝试做一个挖掘problemmail.com。
你也可以尝试一下这个过程:
附加到过程:
strace -ff -s 512 -v -p pid
用strace开始进程:
strace -ff -s 512 -v sendmail -ffromtest ………..
添加-o〜/ sendmail.strace以输出到文件中。
-ff使它跟随叉子
回答我自己的问题(以防其他人使用):
为什么不发送邮件排队消息,并立即返回,所以PHP可以继续运行?
应该这样做。 如果没有,则意味着DNS服务器设置被破坏。 通常DNS查询很快 – 对一个不存在的MX /域的查询应该在毫秒内收到一个NXDOMAIN响应。 它不应该等待这么长时间 – 这个问题可能导致许多程序的其他问题,例如sshd和NFS?
有没有人有任何提示debugging问题?
尝试运行:
host -t mx problemdomain.com
然后使用googleDNS(IP地址为8.8.8.8)而不是当前的DNS服务再次运行它:
host -t mx problemdomain.com 8.8.8.8
如果有差异,则表示当前的DNS服务器设置已损坏。 检查/etc/resolv.conf中的名称服务器,并可能提供与托pipe公司或谁提供您使用的名称服务器的问题票?
作为临时解决方法,请尝试在/etc/resolv.conf中添加DNS超时:
timeout: n sets the amount of time (in seconds) the resolver will wait for a response from a remote name server before retrying the query via a different name server.
有没有人有任何提示如何探讨有问题的电子邮件地址,看看为什么会造成延误?
尝试dig ,DNS查找实用程序和监视状态代码。 例如NOERROR成功,NXDOMAIN找不到,等等:
dig problemdomain.com
尝试nslookup ,一个程序来查询Internet名称服务器:
nslookup problemdomain.com
尝试计时sendmail命令并使用-bi -v获取更多信息:
time echo "This is a test message" | /usr/lib/sendmail -bi -v [email protected] [email protected]