我有几个 Sendmail 服务器,它们通过 SMTP 将大量(数十万)日志电子邮件转发到下游存档存储库。所有这些电子邮件都有相同的收件人域(我们称之为“fooarchiveproviderdomain.com”)。在我这边,我/etc/mail/mailertable
为存档域设置了一个简单的路由:
fooarchiveproviderdomain.com esmtp:[1.1.1.1]:[2.2.2.2]
最近,我注意到主下游 MTA(上例中为 1.1.1.1)会过载,有时无法及时发回横幅问候。在我这边,Sendmail 会在邮件日志中抛出如下错误:
timeout waiting for input from [1.1.1.1] during client greeting
超时后,我看到系统发送到备用路由(上面例子中的 2.2.2.2)并立即被接受。
我相当确定这与负载有关,因为这些超时在高峰时段更常发生。话虽如此,我想了解我的服务器在处理新邮件和之前排队的邮件时启动了多少个连接,所有这些都发往同一个域。
我思考sendmail 会重试单个文件中的排队消息,对吗?所以如果我有 10000 封电子邮件延迟消息……queuerunner惯于启动 10000 个同时连接...它只会发出一个?
我也思考到达不同 SMTP 会话的新邮件会被单独处理,对吗?因此,如果一个 sendmail 邮箱收到 15 条不同的新邮件,则每条邮件都会由一个不同的 sendmail 子守护进程处理,该守护进程会启动自己与下游 MTA 的单独 SMTP 连接?
有没有一种方法可以限制同时的下行连接数而不影响我的服务器可以处理的传入连接数?
答案1
您可以
dsmtp
1)有选择地跳过使用邮件程序的“一次”传送尝试
(它们产生“每个 smtp 会话一条消息”传送)。
mailertable
入口:
fooarchiveproviderdomain.com dsmtp:[1.1.1.1]:[2.2.2.2]
2)使用FEATURE(queuegroup)选择自定义队列组进行交付fooarchiveproviderdomain.com
3)从众多选项中选择如何微调队列组的交付,例如通过队列组参数R=2
(两个并行运行器 = 每个队列组运行两个 SMTP 会话)和I=12m
(每 12 分钟处理一次队列组中的消息)
您可以使用持久队列运行器来降低延迟,而无需“立即”尝试交付。
https://www.safaribooksonline.com/library/view/sendmail-cookbook/0596004710/ch09s06.html
评论:改变如何通过“日记应用程序”发送消息是另一种选择。