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

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

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

我用transport_maps参数做了这个。 这是文件/ etc / postfix / transport

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

问题是,默认情况下smtpd_reject_unlisted_recipient被设置为yes ,但postfix在应用传输图之前检查用户是否存在。 我的postfix服务器不知道这个域的用户testing ,所以它只是拒绝电子邮件。

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

注意:local_recipient_maps不适用于我,因为我使用了dovecot的虚拟传输。 所以收件人表是virtual_mailbox_maps。

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

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


在评论中,你提到你使用来自postfix的虚拟交付代理来发送邮件。 我要告诉你可以在postfixconfiguration中实现无冗余信息。 但是你必须改变当前的后缀设置。

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

好消息是你可以使用relay_recipient_mapstransport_maps一起使用。 为什么? 因为relay_recipient_maps只用来检查用户的存在 。 当接收者存在检查时,transport_maps中的值/右侧string被忽略。 从人postconf中摘录。

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


为了完整性,这里是这个设置的后缀configuration。 向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 - nn - - pipe flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/dovecot-lda -f ${sender} -d ${recipient} 

同样的问题,解决方法我只是在我的数据库中创build虚拟用户,它允许后缀完成收件人存在检查,并重新路由到不同的MX服务器。

我知道它有一点点黑客,它本身对我很有用,因为正在重新路由的帐户最终将被重新定位到相同的MX,所以用户帐户是有效的。