后缀:根据收件人修改发件人地址

我们有一个从我们的应用服务器接收邮件的Postfix服务器。 发件人的格式为[email protected](其中host.fqdn可以不同,具体取决于源服务器),收件人可以是内部或外部用户。

发送给外部用户的邮件应该将发件人更改为[email protected]。 我曾尝试使用规范映射,但是由于这是由清理守护进程处理的,所以在做出任何传输决定之前,它将影响所有发件人地址。

我也尝试创build一个带有通用映射的自定义smtp传输,并configurationtransport_maps来为外部域使用该自定义smtp传输。 但是,通用映射会影响发件人地址和收件人地址。

最后,我尝试了以下内容:

  • 创build一个指定发件人规范映射和唯一传输表的自定义smtpd守护进程。
  • 将所有外部寻址的邮件发送到该自定义守护进程。 理想情况下,发件人规范地图将转换发件人地址,唯一的传输表将中继邮件到互联网。

但是,显然,每个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将包含您想要的发件人映射。