Postfix:根据收件人修改发件人地址

Postfix:根据收件人修改发件人地址

我们有一个 Postfix 服务器,用于接收来自应用服务器的邮件。发件人格式如下:[电子邮件保护](其中 host.fqdn 可能有所不同,具体取决于源服务器)并且收件人可以是内部或外部用户。

发送给外部用户的邮件的发件人应更改为[电子邮件保护]。我曾尝试使用规范映射,但由于这是由清理守护进程处理的,在做出任何传输决策之前,它会影响全部发件人地址。

我还尝试使用通用映射创建自定义 smtp 传输,并配置 transport_maps 以将该自定义 smtp 传输用于外部域。但是,通用映射会影响发件人和收件人的地址。

最后,我尝试了以下方法:

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

但是,显然每个 Postfix 实例只能使用一个传输表。

我想避免创建一个全新的 Postfix 实例来适应这种重写。有什么建议吗?(提前致谢)

答案1

免责声明:当处理包含多个收件人(包括内部和外部域)的电子邮件时,此答案将无法按预期工作

使用 postfix 多实例,解决方案就很简单了。只需设置transport_maps第二个实例,然后在第二个实例中进行重写。

如果没有多个实例,你需要两个 smptd 进程、两个清理进程和访问地图.这个想法是在访问映射中而不是在传输映射中进行过滤。当电子邮件有外部域收件人时,它会传输到第二个 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

在此示例中,我们将设置第二个 smtpd 守护进程在 127.0.0.1 端口 12525 中监听。

现在,设置第二个 smtpd 和清理守护进程master.cf

[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将包含您所期望的发件人映射。

相关内容