我对 SMTP 连接有一些基本问题,特别是针对 Postfix,但也希望得到有关 MS Exchange 的建议:
- 当给定远程域的单个中继不可用时,向该域发送邮件的 Postfix mta 会多久检查一次服务是否可用?
- 失败的连接会被“记住”(即缓存)吗?
- 当“较高优先级”中继可用时,Postfix 是否会检查“较低优先级”中继是否在线?
- 上述任何一个都可以在 Postfix 中调整吗?
答案1
免责声明:此答案仅使用互联网上的一些 Postfix 文档,因此我可能遗漏了一些事实。如需更好更准确的文档,请随意在 Postfix 邮件列表中发布问题(Wietse Venema 是该列表中的活跃成员)或查看 Postfix 源代码。
以上所有问题都集中在后缀退避算法。首先,我将尝试解决目的地死亡问题
以下是man 8 qmgr
STRATEGIES
The queue manager implements a variety of strategies for either opening
queue files (input) or for message delivery (output).
...
destination status cache
The queue manager avoids unnecessary delivery attempts by main-
taining a short-term, in-memory list of unreachable destina-
tions.
根据以上内容,postfix 确实对已死目标主机有缓存。要控制此行为,请调整qmgr_message_recipient_limit
范围。
qmgr_message_recipient_limit(默认值:20000)
Postfix 队列管理器在内存中保存的最大收件人数量,以及内存中短期“死亡”目标状态缓存的最大大小。
那么 Postfix 何时检查主机是否处于活动状态?Postfix 仅在有消息时尝试连接到主机活动队列上面有目的地。除此之外,postfix 不会主动检查主机是否恢复正常。
如果主主机不可用或 Postfix 从远程主机获取错误代码 4xx,则 Postfix 仅检查优先级较低的 MX 主机。其他 MTA 在获取 4xx 错误代码时会采取不同的行为,因为只要 MTA 可用,它们可能永远不会尝试连接到辅助 MX 主机可以连接到主要主机。请参阅:postfix 目标已满/忙/错误 尝试另一个目标和Exchange 不向第二个 MX 发送电子邮件
关于消息重试时间,如果无法传递消息,postfix 会将消息放入延迟队列,直到bounce_queue_lifetime
(对于 postfix 生成的退回)或maximal_queue_lifetime
(对于其他情况)。如上所述,只有当 qmgr 将其放入活动队列时,postfix 才会再次重新传递。以下是来自postfix 文档关于后缀调度算法。
每次延迟队列扫描仅带来一小部分延缓队列回到活动队列进行重试。这是因为延迟队列中的每条消息在延迟时都会被分配一个“冷却”时间。这是通过将队列文件的修改时间扭曲到未来来实现的。如果队列文件的修改时间尚未到达,则不符合重试条件。
“冷却”时间至少为 ,
$minimal_backoff_time
最多为$maximal_backoff_time
。下一次重试时间的设置方法是将消息在队列中的年龄加倍,然后上下调整以使其处于限制范围内。这意味着新消息的初始重试次数要高于旧消息。