在我们的网络服务器上,PHPmail()
命令在某些电子邮件地址上始终挂起,但大多数电子邮件地址都没有问题。它挂起超过 2 分钟,此时 PHP 脚本已与数据库失去连接,因此向浏览器返回错误。
我们用发送邮件我可以在邮件日志中看到 2:36 的延迟(/var/log/邮件日志)查找导致问题的电子邮件地址:
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
问题很容易重现。我可以将要测试的电子邮件放在以下命令中:
echo "Test message from sendmail." | sendmail [email protected] [email protected]
大多数电子邮件地址会导致命令在 1 秒内返回(包括无效的电子邮件地址)。但有问题的电子邮件地址会挂起 2:36。
- 为什么 sendmail 不将消息排队并立即返回以便 PHP 可以继续运行?
- 有人有调试该问题的任何技巧吗?
- 是否有人能提供一些关于如何探测有问题的电子邮件地址以了解其为何导致延迟的提示?
笔记:我们当前有 550 条消息在排队 - 但这个数字并不高于正常水平(find /var/spool/mqueue -type f -name qf\* -print|wc -l|tr -d ' '
)。
答案1
通常电子邮件延迟是由于 DNS 问题造成的。
尝试运行:
host -t mx problemdomain.com
如果这似乎不是问题,请使用sendmail -bi -v
来获取更多的调试输出。
答案2
也许是 DNS 问题,尝试挖掘 problemmail.com。
您还可以尝试 strace 并查看该进程的作用:
附加到进程:
strace -ff -s 512 -v -p pid
使用 strace 启动进程:
strace -ff -s 512 -v sendmail -ffromtest...........
添加 -o ~/sendmail.strace 用于输出到文件。
-ff 使其跟随 forks
答案3
回答我自己的问题(以防对其他人有用):
为什么 sendmail 不将消息排队并立即返回以便 PHP 可以继续运行?
应该可以。如果不行,则意味着 DNS 服务器设置已损坏。通常 DNS 查找很快 - 对不存在的 MX/域的查询应在几毫秒内收到 NXDOMAIN 响应。它不应该等待这么长时间 - 这个问题可能会导致许多程序出现其他问题,例如 sshd 和 NFS?
有人有调试该问题的任何技巧吗?
尝试运行:
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或许可以向托管公司或者提供您正在使用的名称服务器的任何人提出问题?
作为临时解决方法,请尝试在/etc/resolv.conf:
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
查询互联网名称服务器的程序:
nslookup problemdomain.com
尝试对sendmail
命令进行计时并使用-bi -v
以获取更多信息:
time echo "This is a test message" | /usr/lib/sendmail -bi -v [email protected] [email protected]