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

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

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

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

我使用 transport_maps 参数执行了此操作。以下是文件/etc/postfix/transport

[电子邮件保护] smtp:[aspmx.l.google.com]

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

我想让传输路由在收件人存在性检查之前发生(在我当前的设置中,只有 Google SMTP 知道用户的存在测试)。 那可能吗?

注意:local_recipient_maps 对我来说不起作用,因为我使用 dovecot 的虚拟传输。因此收件人表是 virtual_mailbox_maps。

答案1

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

不,这不是 Postfix 的工作方式。收件人存在性检查和电子邮件路由是 Postfix 的两项不同活动。收件人存在性检查是在以下情况下执行的:接受电子邮件. 执行该过程的是邮件传输协议。电子邮件路由在以下情况下执行:传递电子邮件. 执行该过程的是简单重写


在评论中,你提到你使用Postfix 的虚拟传送代理发送电子邮件。我要告诉你,在 Postfix 配置中实现无冗余信息是可能的。但你必须更改当前的 Postfix 设置。

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

好消息是你可以relay_recipient_maps和一起使用transport_maps。为什么?因为relay_recipient_maps只用于检查存在用户。在检查收件人存在性时,transport_maps 中的值/右侧字符串被忽略。摘自人postconf

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


为了完整性,这里是此设置的 postfix 配置。鸣谢雪崩直升机为了这个想法

#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}

答案2

遇到同样的问题,为了修复它,我刚刚在数据库中创建了虚拟用户,它允许 postfix 完成收件人存在检查并重新路由到不同的 MX 服务器。

我知道这有点像黑客行为,但就我个人而言,它对我有用,因为被重新路由的帐户最终将被重新定位到同一个 MX,因此用户帐户是有效的。

答案3

我通过做与 mailman3 类似的事情解决了这个问题:

  1. 在 gmail 中创建一个别名子域名(例如 gm.example.com)。请注意,由于某些奇怪的原因,gmail 不允许使用 gmail.example.com。
  2. 将此子域名添加到relay_domains(我使用了哈希图)
  3. 使用 virtual_alias_maps 将你的主域名转发到 Gmail 用户的新子域名
  4. 使用此子域名将您的 gmail 用户添加到 transport_maps

虚拟别名映射:

[email protected] [email protected]

运输地图:

[email protected] smtp:aspmx.l.google.com

相关内容