You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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_listdebug_peer_level但没得到足够细节,是因为还需要开启SMTP模块的调试:

  1. main.cf中添加:
smtp_debug = 3  # 级别2或3足够,越高日志越详细
debug_peer_list = relayhost.test.com
debug_peer_level = 3
  1. 重启Postfix:sudo systemctl restart postfix
  2. 重新发送测试邮件,然后查看/var/log/mail.log,你会看到Postfix和relayhost之间完整的SMTP对话细节,包括EHLO响应、TLS握手过程、SASL认证的每一步,这些信息能直接告诉你是哪一步被拒绝了(比如认证失败、TLS握手失败、发件人被拒绝等)

三、手动模拟SMTP对话,直接测试与relayhost的通信

有时候绕过Postfix,直接用命令行模拟SMTP交互,能更清晰地定位问题:

  1. 用openssl连接到relayhost的587端口(开启TLS):
openssl s_client -connect relayhost.test.com:587 -starttls smtp
  1. 连接成功后,手动输入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认证的配置细节

  1. 确认sasl_passwdsasl_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
  1. 确认SASL机制是否匹配:你的smtp_sasl_mechanism_filter = plain,要确保relayhost支持PLAIN认证(Thunderbird能用的话应该是支持的,但可以在手动SMTP测试里确认)

五、排查TLS相关问题

  1. 确认CA证书是否有效:你的smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt,如果relayhost使用的是公共CA颁发的证书,这个文件应该没问题;如果是自签证书,你需要把自签证书添加到这个文件里,或者临时设置smtp_tls_verify_cert = no来测试(注意生产环境不要用这个设置)
  2. 调整TLS安全级别:可以临时把smtp_tls_security_level = encrypt改成smtp_tls_security_level = may,看看是否能正常连接,这能排除TLS强制加密导致的握手失败问题

备注:内容来源于stack exchange,提问作者terano

火山引擎 最新活动