我们有一个 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
将包含您所期望的发件人映射。