Postfix配置全域全用户邮件捕获后无法正常发送外部邮件的问题求助
Postfix配置全域全用户邮件捕获后无法正常发送外部邮件的问题求助
看起来你遇到的是Postfix虚拟别名递归重写的坑——当你把root的邮件转发到Gmail地址后,这个外部邮箱地址又被你的全局通配符规则/.*/匹配,再次重写到specificuser,导致邮件根本发不出去,还是留在了本地。
问题根源
Postfix的virtual_alias_maps默认会对重写后的收件人地址进行递归查询,直到没有匹配的规则为止。你的/.*/规则会匹配所有地址,包括外部域名的邮箱(比如你的Gmail地址),所以转发后的地址又被二次捕获了,这就是日志里看到的两次重写过程。
解决方案
你需要调整PCRE规则的顺序和匹配范围,让外部域名的地址不被全局规则覆盖,具体可以这么做:
方案一:缩小全局规则的匹配范围(推荐)
只让全局规则捕获本地服务器域名的收件人地址,外部地址直接放行。把特定的转发规则放在最前面(Postfix按文件顺序匹配,先匹配到的规则优先生效)。
修改你的/etc/postfix/virtual文件:
# 先处理root的转发请求,覆盖本地域名和纯root用户(无域名的本地账号) /^root@localserver\.com$/ emailaddress@gmail.com /^root$/ emailaddress@gmail.com # 捕获所有本地域名的收件人到specificuser /.*@localserver\.com/ specificuser # 如果服务器还有其他本地域名,添加类似规则即可 # /.*@your-other-domain\.com/ specificuser
这样设置后,cron发送的root@localserver.com邮件会先匹配第一条规则,直接转发到Gmail。而Gmail地址不属于你的本地域名,不会触发后面的全局规则,Postfix就会正常把邮件发送到外部服务器。
方案二:用负向预查排除特定外部地址(适合特殊场景)
如果你确实需要保留全局捕获所有地址的规则,只是要排除特定的外部邮箱,可以用PCRE的负向预查语法:
# 先处理root的转发 /^root@localserver\.com$/ emailaddress@gmail.com /^root$/ emailaddress@gmail.com # 捕获所有地址,除了你的Gmail地址 /(?!^emailaddress@gmail\.com$).*/ specificuser
不过这种方法扩展性差,以后如果要转发更多外部地址,你得不断修改排除规则,不如方案一稳妥。
最后一步:更新配置并重启Postfix
修改完规则后,记得更新映射表并重载服务:
postmap /etc/postfix/virtual systemctl reload postfix
备注:内容来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

