我有一个PHP web应用程序,它使用SMTP来发送localhost上的sendmail邮件。
我希望sendmail立即接受邮件请求,并将其排入队列以供稍后发送,因为我不希望在电子邮件上阻塞面向用户的请求线程。
在RHEL Web服务器上安装Sendmail的默认设置。
有时sendmail在MAIL命令发送后会被阻塞很长时间 – 有时会花60或90秒来接收邮件。 时间通常非常接近60或90秒,这使我觉得这是一种超时。
我查看了sendmail日志,还有很多“延期”的电子邮件,但是没有任何内容对这个延迟负责。
sendmail ? sendmail总是立即接受邮件,排队邮件以供以后发送? 更新:我不确定,但看起来这可能是链接到aol.com地址。 我强烈怀疑sendmail在收发邮件阶段正在进行某种封锁收件人地址validation。 我怎样才能禁用,以便sendmail不会阻止我的UI线程?
更新2:这似乎只发生在繁忙时间。 也许我用完了sendmail线程或什么? 我如何检查?
有几个sendmail调优参数可能影响初始传送尝试。 看看Sendmail调优 。
我一直无法修复sendmail ,所以我写了一个应用层队列来保存电子邮件,然后再发送到sendmail ,这为我排除了这个问题。 电子邮件通过Web请求线程在磁盘上排队,然后单个后台线程(每个Web服务器)将该电子邮件从该队列传递到sendmail 。
我添加了额外的日志logging,并且sendmail在接收电子邮件时仍然偶尔阻塞(现在只有5-15秒)。 我曾经以为sendmaildevise是为了立即接受所有的电子邮件,而不是阻塞,然后尝试将它们传送到最后的收件人在后台的自己的队列。
慢邮件的频率现在要低得多。 我想知道是否部分问题是sendmail的“接收”线程已经用完了。
在我的原始设置中,只要用户操作导致发送电子邮件,所有PHP请求处理线程就会将其电子邮件传递到sendmail (通过SMTP)。 在繁忙的时候,这肯定意味着sendmail同时收到大量的电子邮件。 偶尔会阻止60-90秒(这对我的应用程序的性能来说是灾难性的)。
现在,我已经添加了这个应用层队列,它通过pipe道将电子邮件发送到最多1个线程上的sendmail , sendmail似乎能够在没有阻塞的情况下使用相同数量的电子邮件处理罚款(大部分时间)。 它偶尔会阻止,这使得它不适合作为电子邮件排队层。