Postfix smtpd 拒绝连接原因排查:怎么区分 rejected / deferred / discard?
Postfix 的 smtpd(8) 服务对不合规的发信连接有三种不同处理方式,mail.log 中分别记录为 reject、defer、discard。三者的严重程度和后续处理完全不同。
1. reject(拒绝) — 对端收到 5xx 永久错误。
日志示例:NOQUEUE: reject: RCPT from [x.x.x.x]: 554 5.7.1 ...
原因:黑名单命中、SPF fail、发件人域名不存在等。处理:检查 smtpd_client_restrictions 配置链中哪个规则导致。
2. defer(推迟) — 对端收到 4xx 临时错误。
日志示例:NOQUEUE: reject_warning: RCPT from [x.x.x.x]: 450 4.7.1 ... 或 relay access denied 配上 4xx。
原因:DNS 临时故障、对方 IP 触发 smtpd_client_connection_rate_limit、灰名单(greylist)等。
处理:检查 smtpd_delay_reject = yes 时,某些规则会在 RCPT TO 阶段才触发。用 postfix warning 跟踪预警。
3. discard(丢弃) — 对端认为已成功(收到 250 OK),但邮件直接被丢弃。
日志示例:NOQUEUE: discard: RCPT from [x.x.x.x]: 250 2.0.0 OK (discarded)
原因:smtpd_discard_ehlo_keyword_* 或内容过滤策略。处理:检查 body_checks、header_checks 和 smtpd_end_of_data_restrictions 配置。
4. 快速统计命令:grep -c "reject:" /var/log/mail.loggrep -c "NOQUEUE: defer" /var/log/mail.loggrep -c "discard:" /var/log/mail.log
RFC 5321 §4.2 (Reply Codes) · Postfix SMTPD(8) manual page · Postfix XCLIENT(8) manual page
