原因

mailq 显示大量 deferred 状态邮件时,核心原因通常是某个或某几个目标域无法投递(DNS 解析失败、对方拒收、"> 原因

mailq 显示大量 deferred 状态邮件时,核心原因通常是某个或某几个目标域无法投递(DNS 解析失败、对方拒收、">

Postfix 队列中 thousands deferred messages 怎么批量处理和排查?

39 Postfix 队列中 thousands deferred messages 怎么批量处理和排查?
原因

mailq 显示大量 deferred 状态邮件时,核心原因通常是某个或某几个目标域无法投递(DNS 解析失败、对方拒收、连接超时),而非每封邮件各自出问题。盲目 postsuper -r ALL 会导致重复投递,甚至被对方 IP 制裁。

操作

1. 先分类定位问题源:
mailq | awk '/^[0-9A-F]+/ { print $NF }' | sort | uniq -c | sort -rn | head -20
按目标域统计队列分布,找出占 80% 以上的"凶手域"。
2. 查看该域的延迟日志:
egrep "to=<.*@problem-domain\.com>" /var/log/mail.log | tail -20
找出具体退信码 — 是 4xx(可恢复)还是 5xx(不可恢复)。
3. 处理策略:
— 5xx(如 550 user unknown):postsuper -d ALL deferred 清除后,先修正发信列表再重启。
— 4xx(如 450 try again):排查对方 DNS/连接问题后,postqueue -f 触发刷新。
— 只删除特定域:mailq | awk '/@problem-domain\.com/ { print $1 }' | postsuper -d -
4. 防止复发:对低信誉域设置 per-domain 限速:
smtp_destination_rate_delay = 2s
default_destination_concurrency_limit = 5
5. 监控预警:cron 定期跑 mailq | grep -c "^[0-9A-Z]",超过阈值告警。

RFC 5321 §4.5.3 (Queueing) · Postfix qmgr(8) manual page · RFC 3463 (Enhanced Mail System Status Codes)