我有一个 PHP 网络应用程序,它使用 SMTP 通过 sendmaillocalhost
发送电子邮件。
我希望 sendmail 立即接受邮件请求并将其排队以供稍后发送,因为我不想让面向用户的请求线程在电子邮件上被阻止。
Sendmail 使用默认设置安装在 RHEL Web 服务器上。
有时命令发送sendmail
后会阻塞很长时间MAIL
——有时需要 60 或 90 秒才能接受邮件。所用时间通常非常接近 60 或 90 秒,这让我认为这是某种超时。
我查看了 sendmail 日志,发现有很多“延迟”的电子邮件,但没有任何邮件看起来是造成这种延迟的原因。
- 我怎样才能诊断出是什么导致了速度减慢
sendmail
? - 我如何配置
sendmail
始终立即接受邮件并将邮件排队以便稍后发送?
更新:我不确定,但看起来这可能与aol.com
地址有关。我强烈怀疑它sendmail
在接受电子邮件发送阶段进行某种阻止收件人地址验证。我该如何禁用它,这样它就sendmail
不会阻止我的 UI 线程?
更新 2:这似乎只发生在繁忙时段。也许我的线程用完了sendmail
?我该如何检查?
答案1
有几个 sendmail 调整参数可能会影响初始投递尝试。请查看Sendmail 调优。
答案2
我无法修复sendmail
,因此我编写了一个应用层队列来在电子邮件发送到 之前保存它们,这为我解决了这个问题。电子邮件由 Web 请求线程在磁盘上排队,然后单个后台线程(每个 Web 服务器)将电子邮件从该队列sendmail
传递到。sendmail
我添加了额外的日志记录,但sendmail
在接收电子邮件时仍然偶尔会被阻止(现在只有 5-15 秒)。我原以为sendmail
设计为立即接受所有电子邮件,而不会阻止,然后尝试在后台将其发送到其自己的队列中的最终收件人。
现在电子邮件发送缓慢的频率大大降低。我想知道问题是否部分是由于sendmail
“接收”线程用完了。
sendmail
在我最初的设置中,一旦用户操作导致发送电子邮件,所有 PHP 请求处理线程都会将其电子邮件传递(通过 SMTP)。在繁忙时段,这肯定意味着它sendmail
会同时接收大量电子邮件。它偶尔会阻塞 60-90 秒(这对我的应用程序的性能来说是灾难性的)。
现在我已经添加了这个应用层队列,它将电子邮件传输到sendmail
最多 1 个线程,sendmail
似乎能够很好地处理相同数量的电子邮件(大多数时候),而不会出现任何阻塞。但它偶尔会阻塞,这使得它不适合用作电子邮件排队层。