Postfix配置问题:如何将外发邮件本地保存而非转发?
嘿,我来帮你捋捋这个问题!你的需求很明确——不管是 incoming 还是 outgoing 的邮件,都得通过自定义的 saveemail 脚本本地保存,但现在外发邮件却被 Postfix 当成远程邮件尝试转发,导致了“Relay access denied”的错误,而 incoming 邮件正常处理,对吧?
从你给出的配置和日志来看,问题根源在于 Postfix 对邮件路由的判断逻辑:目前你的 mydestination 只包含了本地主机和 localhost 相关的域名,当外发邮件的收件人域名不在这个列表里时,Postfix 会默认认为这是要发往外部的邮件,自然就会尝试转发,结果就触发了中继权限的报错。
下面给你两个实用的解决思路,你可以根据自己的实际场景选择:
方法一:强制所有邮件走 saveemail 传输(推荐)
这是最直接的方案,不管收件人是什么域名,都让 Postfix 调用你的自定义脚本处理,完全跳过转发逻辑。
- 打开 Postfix 的主配置文件
main.cf,添加或修改transport_maps配置项:transport_maps = hash:/etc/postfix/transport - 创建
/etc/postfix/transport文件,写入全局匹配规则:
这里的* saveemail:*代表匹配所有收件人地址,saveemail:指定使用你已经定义好的自定义传输。 - 生成 transport 的哈希数据库文件(Postfix 需要这个才能识别规则):
postmap /etc/postfix/transport - 重启 Postfix 让配置生效:
systemctl restart postfix
方法二:将外发目标域名加入本地投递范围
如果你的外发邮件都是针对固定几个域名的,也可以把这些域名加到 mydestination 里,让 Postfix 把它们当成本地邮件处理,再通过脚本保存。
比如你常发的域名是 example.com 和 test.org,修改 main.cf 里的 mydestination:
mydestination = $myhostname, localhost.$mydomain, localhost, example.com, test.org
改完后重启 Postfix 就行。不过这种方式只适合域名固定的场景,如果是任意域名的外发邮件,还是方法一更靠谱。
最后别忘了检查这个点
请确认你的 master.cf 文件里已经正确配置了 saveemail 传输的定义,比如类似这样的配置:
saveemail unix - n n - - pipe flags=F user=yourusername argv=/path/to/your/saveemail.sh ${sender} ${recipient}
要保证脚本的路径正确,权限设置合理,Postfix 有执行它的权限。
你可以先试试方法一,应该能立刻解决外发邮件被转发的问题,之后查看 Postfix 日志确认所有邮件都触发了 saveemail 脚本就没问题啦。
备注:内容来源于stack exchange,提问作者Chika228

