Postfix 队列堆积大量邮件怎么办?怎么排查?

Postfix 队列堆积大量邮件怎么办?怎么排查?
队列状态速览:
# 查看队列分布(按目标域统计)
qshape        # 显示延迟分布和数量
qshape deferred   # 仅看延迟队列

# 示例输出解读:
#               T  5 10 20 40 80 160 320 640 1280 1280+
# TOTAL      1532 200 300 400 300 200 100  20  10    2    0
# gmail.com  1200 150 250 350 250 150  40   8   2    0    0
# ↑ gmail.com 目标积压1200封,集中在10-40分钟延迟 → DNS或速率限制问题
常见积压原因与诊断命令:
① 目标服务器不可达:grep "Connection timed out" /var/log/mail.log | tail -20
② 被对方限速/灰名单:grep "450 4.7.1\|451 4.3.0\|Server busy" /var/log/mail.log | tail -20
③ 本地 DNS 问题:time dig MX gmail.com +short 超时则 DNS 有问题
④ 本地网络出方向受阻:telnet gmail-smtp-in.l.google.com 25 无法连接则检查防火墙和 NAT
⑤ 队列 I/O 瓶颈:iostat -x 1 5 如果 %util 接近 100%,需要 SSD 或队列分区扩容。
处理策略:
① 如果队列中大多是垃圾邮件被反弹——执行 postsuper -d ALL deferred 清理所有延迟邮件(谨慎!会丢失合法延迟邮件);
② 如果目标服务器临时故障——等待即可,Postfix 会自动按退避算法重试(默认重试 5 天,RFC 5321 Section 4.5.4.1);
③ 如果需要立即重发特定域的队列——postqueue -s gmail.com(立刻刷新该域的队列);
④ 永久性问题(如被对方列入黑名单)——解决黑名单问题后,用 postsuper -r ALL 将所有延迟邮件重新排队。

📎 RFC 5321 Section 4.5.4.1 重试策略;Postfix QSHAPE 文档