Postfix切换至587端口发送邮件后收件人识别失败问题求助
兄弟,我之前折腾Postfix的时候也踩过几乎一模一样的坑,咱们一步步拆解问题、解决掉它!
首先得先理清楚你现在的状况:你本来发邮件用25端口被拒,于是设置了relayhost=[myhostname.com]:587,结果现在变成收件人不被识别——这大概率是因为你配置了relayhost之后,Postfix把所有邮件都往这个中继地址发,但你的服务器没搞清楚哪些是本地收件人,或者587端口的SMTP服务没允许中继外部邮件。
给你几个具体的排查和修复步骤:
1. 先明确「本地收件人」范围,避免本地邮件被误发往中继
打开Postfix的主配置文件main.cf,找到mydestination参数,确保它包含你的域名(比如myhostname.com),配置大概是这样:
mydestination = $myhostname, myhostname.com, localhost.localdomain, localhost
这个参数的作用是告诉Postfix:这些域名下的收件人是本地用户,不需要发往relayhost,直接本地投递就行。如果你的域名没在这个列表里,Postfix会把本地收件人的邮件也发往relayhost,而你的中继服务(自己的587端口)不认识这些收件人,就会报错。
修改后记得执行systemctl reload postfix生效。
2. 确保587端口的SMTP服务允许中继外部邮件
Postfix的587端口是「提交端口」(submission),默认可能没配置允许中继外部邮件。打开master.cf文件,找到submission的配置块,确保它的smtpd_relay_restrictions参数包含允许认证用户或本地网络的规则:
submission inet n - y - - smtpd -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination -o smtpd_sasl_auth_enable=yes -o smtpd_tls_security_level=encrypt
这里的关键是permit_sasl_authenticated——它允许通过SASL认证的客户端(包括你自己的Postfix)中继外部邮件;permit_mynetworks允许本地服务器发起的连接中继邮件(如果你的Postfix和Dovecot在同一台服务器,这个也很有用)。
修改后同样要reload Postfix。
3. 配置Postfix客户端连接自己的587端口时进行认证
当你设置relayhost=[myhostname.com]:587后,Postfix相当于作为一个客户端连接自己的587端口,这时候需要提供合法的账号密码才能被允许中继。
- 首先在
main.cf里添加以下配置:
smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_security_level = encrypt
- 然后创建
/etc/postfix/sasl_passwd文件,内容是:
[myhostname.com]:587 你的邮箱账号:对应的密码
比如你的邮箱是user@myhostname.com,就写[myhostname.com]:587 user@myhostname.com:yourpassword。
- 最后执行以下命令生成哈希映射并重启Postfix:
postmap /etc/postfix/sasl_passwd systemctl reload postfix
额外说明:别混淆「发送端口」和「提交端口」的用途
这里顺便纠正一个可能的误解:Postfix作为邮件服务器(MTA),默认是用25端口连接对方邮件服务器的25端口来投递邮件的。如果你的ISP封了25端口,那你确实没法直接投递到外部,这时候要么用外部中继服务,要么通过自己的587端口中转(就是你现在尝试的方式)。但如果ISP没封25端口,其实你完全可以去掉relayhost配置,直接让Postfix用25端口发邮件——只是很多现代邮件服务商可能会把25端口发来的邮件标记为垃圾,这时候用DKIM、SPF等域名认证会更有用。
按照上面的步骤调整后,应该就能解决收件人识别失败的问题了,你可以先测试发一封本地邮件和一封外部邮件看看效果~
备注:内容来源于stack exchange,提问作者Brendan Murray

