我有一个PHP应用程序,它使用SMTP在localhost上发送邮件来发送电子邮件。
我希望sendmail立即接受邮件请求,并将其排队等待稍后发送,因为我不希望在电子邮件上阻塞面向用户的请求线程。
Sendmail是在RHEL web服务器上安装的默认设置。
有时,sendmail在发送MAIL命令之后会阻塞很长时间--有时需要60秒或90秒才能接收邮件。时间通常接近60秒或90秒,这让我觉得这是某种超时。
我已经查看了sendmail日志,并且有大量的“延迟”邮件,但是没有什么可以对此延迟负责。
sendmail?sendmail配置为始终立即接受邮件并将邮件排队以供以后发送?更新:我不确定,但看起来这可能是链接到aol.com地址。我强烈怀疑sendmail在接受电子邮件发送阶段正在做某种阻塞的接收地址验证。我如何禁用它,这样sendmail就不会阻塞我的UI线程?
更新2:这似乎只发生在繁忙的时间。也许我已经用完了sendmail线程什么的?我怎么才能查到?
发布于 2013-11-08 17:14:35
有几个sendmail调优参数可能影响初始传递尝试。看看发送邮件调优。
发布于 2013-11-21 09:39:08
我一直无法修复sendmail,所以我写了一个应用程序层队列,在邮件发送到sendmail之前保存电子邮件,这为我解决了这个问题。电子邮件由web请求线程在磁盘上排队,然后单个后台线程(每个web服务器)将电子邮件从该队列传递给sendmail。
我增加了额外的日志记录,sendmail在接收电子邮件时仍然偶尔会阻塞(现在只有5-15秒)。我原以为sendmail的设计是立即接收所有的电子邮件,而不阻塞它们,然后尝试将它们在自己队列中的后台发送给最终的收件人。
慢发邮件的频率现在要低得多。我想知道问题的一部分是否是sendmail耗尽了“接收”线程。
在我最初的设置中,当用户操作导致电子邮件发送时,所有的PHP请求处理线程都会将其电子邮件传递到sendmail (通过SMTP)。在繁忙的时候,这一定意味着sendmail同时收到了大量的电子邮件。它偶尔会阻塞60-90秒(这对我的应用程序的性能来说是灾难性的)。
现在我已经添加了这个应用程序层队列,它最多在一个线程上将电子邮件传输到sendmail,sendmail似乎能够很好地处理(大多数情况下)相同数量的电子邮件,而完全不阻塞。不过,它偶尔也会阻塞,这使得它不适合作为电子邮件排队层。
https://serverfault.com/questions/551649
复制相似问题