Postfix 向中继主机发送邮件被DSN=5.0.0退回的调试方案咨询
Postfix 向中继主机发送邮件被DSN=5.0.0退回的调试方案咨询
看起来你遇到了一个典型的Postfix中继配置问题,DSN=5.0.0的无详情错误确实让人头疼,不过我们可以一步步排查,先从最可能的配置错误入手,再逐步深入调试。
一、先检查致命的配置错误:relay_transport 设置
我注意到你的main.cf里配置了:
default_transport = error relay_transport = error
relay_transport这个参数是Postfix用来指定中继邮件时使用的传输方式,你把它设成error的话,Postfix根本不会尝试去连接你的relayhost,直接就会返回5.0.0的错误,这很可能就是当前问题的根源!
解决方法:
- 注释掉或删除
relay_transport = error这一行(默认的relay_transport就是smtp,完全符合你的需求) - 同时
default_transport = error本身没问题:它是用来处理非本地、非中继的邮件,你的场景是只发送脚本生成的 outbound 邮件到relayhost,这个设置能避免Postfix处理无关邮件 - 执行
sudo systemctl restart postfix,然后重新发送测试邮件看看是否恢复正常
二、如果问题依然存在,提升Postfix的调试日志级别
你之前加了debug_peer_list和debug_peer_level但没得到足够细节,是因为还需要开启SMTP模块的调试:
- 在
main.cf中添加:
smtp_debug = 3 # 级别2或3足够,越高日志越详细 debug_peer_list = relayhost.test.com debug_peer_level = 3
- 重启Postfix:
sudo systemctl restart postfix - 重新发送测试邮件,然后查看
/var/log/mail.log,你会看到Postfix和relayhost之间完整的SMTP对话细节,包括EHLO响应、TLS握手过程、SASL认证的每一步,这些信息能直接告诉你是哪一步被拒绝了(比如认证失败、TLS握手失败、发件人被拒绝等)
三、手动模拟SMTP对话,直接测试与relayhost的通信
有时候绕过Postfix,直接用命令行模拟SMTP交互,能更清晰地定位问题:
- 用openssl连接到relayhost的587端口(开启TLS):
openssl s_client -connect relayhost.test.com:587 -starttls smtp
- 连接成功后,手动输入SMTP命令(每输完一行按回车):
EHLO smtp-client.test.com# 模拟Postfix的问候AUTH PLAIN <base64编码的用户名密码># 把test@hosting.com:mypassword用base64编码,比如用echo -n "test@hosting.com:mypassword" | base64生成编码字符串MAIL FROM:<user@smtp-client.test.com># 你的发件人地址RCPT TO:<me@testdomain.com># 收件人地址DATA# 开始输入邮件内容Subject: Test Manual Mail- This is a test mail from manual SMTP.
.# 句号结束邮件内容QUIT# 退出连接
在这个过程中,你能看到relayhost的每一步响应,比如如果认证失败会返回535 5.7.8 Authentication credentials invalid,如果发件人被拒绝会有对应的错误码,这些都是Postfix日志里可能没显示的细节。
四、检查SASL认证的配置细节
- 确认
sasl_passwd和sasl_passwd.db的权限:Postfix要求这两个文件必须只有root能读写,否则会拒绝加载,执行:
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
然后重新执行postmap并重启Postfix:
sudo postmap /etc/postfix/sasl_passwd sudo systemctl restart postfix
- 确认SASL机制是否匹配:你的
smtp_sasl_mechanism_filter = plain,要确保relayhost支持PLAIN认证(Thunderbird能用的话应该是支持的,但可以在手动SMTP测试里确认)
五、排查TLS相关问题
- 确认CA证书是否有效:你的
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt,如果relayhost使用的是公共CA颁发的证书,这个文件应该没问题;如果是自签证书,你需要把自签证书添加到这个文件里,或者临时设置smtp_tls_verify_cert = no来测试(注意生产环境不要用这个设置) - 调整TLS安全级别:可以临时把
smtp_tls_security_level = encrypt改成smtp_tls_security_level = may,看看是否能正常连接,这能排除TLS强制加密导致的握手失败问题
备注:内容来源于stack exchange,提问作者terano




