如果用户本地不存在,如何将具有 Transport_maps 的域的某些电子邮件帐户路由到另一个 MX?

Fox*_*Fox 5 postfix

我的域example.com中的 MX 服务器指向我的 Postfix 服务器。不过,我还配置了一个负责example.com电子邮件的 Google Apps 帐户。

我希望所有电子邮件都转到我的 Postfix 服务器(这已通过 DNS 区域中的 MX 设置完成),但希望将此域的某些用户转发到 MX aspmx.l.google.com

我使用 Transport_maps 参数做到了这一点。这是文件/etc/postfix/transport

test@example.com smtp:[aspmx.l.google.com]

问题是,smtpd_reject_unlisted_recipient默认设置为yes ,但 postfix 在应用传输映射之前会检查用户是否存在。我的 Postfix 服务器不知道该域的用户测试,因此它只是拒绝电子邮件。

我希望在收件人存在检查之前进行传输路由(在我当前的设置中,只有 Google SMTP 知道用户test的存在)。那可能吗?

注意:local_recipient_maps 对我不起作用,因为我使用带有 dovecot 的虚拟传输。所以收件人表是virtual_mailbox_maps。

mas*_*oeh 1

为什么路由不在收件人存在检查之前发生?难道就没有办法了吗?当我路由电子邮件时,我的意思是“当前的 Postfix 不处理任何事情,只是将电子邮件转发到另一台完全负责配置的服务器”。

不,这不是 postfix 的工作方式。收件人存在检查和电子邮件路由是 postfix 的两项不同活动。接受电子邮件时执行收件人存在检查。执行它的进程是smtpd发送电子邮件时执行电子邮件路由。执行它的过程是微不足道的重写


在评论中,您提到您使用虚拟投递代理从 postfix来投递电子邮件。我要告诉你,在后缀配置中实现无冗余信息是可能的。但您必须更改当前的后缀设置。

为了实现你的目标,我们必须将virtual_mailbox_domain课堂上的所有领域转移到relay_domains课堂上。然后使用 dovecot LDA 将电子邮件发送到正确的邮箱中。中继域类有一个名为“relay_recipient_maps”的特殊参数来检查收件人是否存在。

好消息是您可以relay_recipient_maps与 一起使用transport_maps。为什么?因为relay_recipient_maps仅用于检查用户是否存在。检查收件人是否存在时,transport_maps 中的值/右侧字符串被忽略。来自man postconf的片段。

可选查找表,其中包含与 $relay_domains 匹配的域中的所有有效地址。将 @domain 指定为没有有效收件人列表的域的通配符,并成为反向散射邮件的来源:Postfix 接受不存在收件人的垃圾邮件,然后向无辜者发送无法投递的邮件。从技术上讲,用 $relay_recipient_maps 列出的表用作列表:Postfix 仅需要知道是否找到查找字符串,但它不使用表查找的结果。


为了完整起见,这里是此设置的后缀配置。这个想法归功于sebokopter

#main.cf
# rename virtual_mailbox_domains to relay_domains
relay_domains = mydomain.example.com
# put the parameter value of virtual_mailbox_maps AND transport_maps parameter
relay_recipient_maps = hash:/my/virtual_mailbox_maps, hash:/my/transport_maps

transport_maps = hash:/my/transport_maps
relay_transport = dovecot:

#master.cf
dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/dovecot-lda -f ${sender} -d ${recipient}
Run Code Online (Sandbox Code Playgroud)