我们有一个从我们的应用服务器接收邮件的Postfix服务器。 发件人的格式为[email protected](其中host.fqdn可以不同,具体取决于源服务器),收件人可以是内部或外部用户。
发送给外部用户的邮件应该将发件人更改为[email protected]。 我曾尝试使用规范映射,但是由于这是由清理守护进程处理的,所以在做出任何传输决定之前,它将影响所有发件人地址。
我也尝试创build一个带有通用映射的自定义smtp传输,并configurationtransport_maps来为外部域使用该自定义smtp传输。 但是,通用映射会影响发件人地址和收件人地址。
最后,我尝试了以下内容:
但是,显然,每个Postfix实例只能使用一个传输表。
我想避免创build一个全新的Postfix实例来适应这种重写。 有什么build议么? (并提前感谢)
免责声明:当处理电子邮件有多个收件人同时拥有内部和外部域的电子邮件时,此答案将无法正常工作
使用postfix多实例,解决scheme将是微不足道的。 只需将transport_maps设置为第二个实例,然后在第二个实例中进行重写。
如果没有多个实例,则需要两个smptd进程,两个清理进程和访问映射 。这个想法是在访问映射中进行过滤,而不是在transport_maps中进行过滤。 当一封电子邮件有外部域名收件人时,它将被传送到第二个smtpd守护程序。 然后第二个smtpd守护进程会调用第二个清理守护进程。 第一个清理守护进程不会有规范映射参数,而在第二个清理守护进程中,我们将添加该参数来进行重写。
在main.cf中,在smtpd _ * _ restriction中定义check_recipient_access。 例如:
smtpd_recipient_restriction = ... check_recipient_access hash:/etc/postfix/external-filter ...
在external-filter文件中定义一个过滤机制
external.example.com FILTER smtp:[127.0.0.1]:12525
在这个例子中,我们将在127.0.0.1端口12525中设置第二个smtpd守护进程监听。
现在,在master.cf设置第二个smtpd和cleanup守护进程
[127.0.0.1]:12525 .... smtpd -o cleanup_service_name=cleanup_rewrite cleanup_rewrite .... cleanup -o canonical_maps=hash:/etc/postfix/mysender_rewriting
文件mysender_rewriting将包含您想要的发件人映射。