我希望设置 Postfix 以根据目标主机名使用外部中继,即:
- 如果目标主机名是 *.outlook.com,则使用中继 some_smtp.example.com
- 如果有任何其他目标主机名,请使用本地中继
我所说的目标主机名是从 MX 记录获取的主机名。如果收件人域有 MX 记录microsoft-com.mail.protection.outlook.com
,则使用不同的中继
我知道可以根据发送方地址指定中继(使用sender_dependent_relayhost_maps
),但对于我的情况这是不切实际的。
目标是针对挑剔的目标主机使用不同的中继:可能是 Mandrill,或者另一个 Postfix 安装。
答案1
您可以设置传输图来有选择地选择具有@outlook.com
目标地址的邮件并通过some_smtp.example.com
如下所示的方式转发它们。
添加以下条目到/etc/postfix/transport
outlook.com smtp:[some_smtp.example.com]
添加以下条目到/etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
执行以下命令后重启postfix
sudo postmap /etc/postfix/transport
答案2
Arul 的回答非常适合基于收件人域的传输。但是,由于您引用的是 MX 记录主机名而不是收件人域,因此答案不适用。
一个解决方案是使用check_recipient_mx_access
。摘自官方文档
检查收件人_mx_access类型:表格
搜索为 RCPT TO 域的 MX 主机指定 access(5) 数据库,并执行相应的操作。注意:出于安全原因,不允许结果为“OK”。相反,请使用 DUNNO 来将特定主机从黑名单中排除。此功能在 Postfix 2.1 及更高版本中可用。
对于你的情况,只需将其放在check_recipient_mx_access hash:/etc/postfix/finickydestination
适当的位置即可smtpd_*_restriction
。在该文件中输入主机名
# /etc/postfix/finickydestination
.outlook.com FILTER smtp:[some_smtp.example.com]
不要忘记对文件进行 postmap 并执行 postfix reload。
参考):
答案3
正如@user221326(我没有足够的声望来发表评论)指出的那样,@masegaloeh 的回答将不是按照check_recipient_mx_access
预期工作访问表和ACTION
更多信息手册页
你想要的操作是FILTER
这样的
.outlook.com FILTER smtp:[some_smtp.example.com]
请注意,如果有多个,FILTER
只有最后一个会触发,因此请确保这在其他所有之后触发。
此外,仅当满足以下条件.outlook.com
时,才会捕获子域名/超级域名(例如 whatever.protection.outlook.com):smtpd_access_maps
不是否则parent_domain_matches_subdomains
你想要outlook.com
(没有前导点)
最后请记住,此操作适用于整封邮件只要一个收件人的 MX 与域匹配,只要您定义的目标不是 MDA,这应该不是问题。
干杯
答案4
正如上面评论的那样:“对于您的情况,只需将 check_recipient_mx_access hash:/etc/postfix/finickydestination 放在 smtpd_*_restriction 的适当位置。在该文件中输入主机名”
smtpd_sender_restrictions 不是合适的地方,因为在 smtp 事务中,postfix 不知道接收者是谁。
此外,如果您有更多 FILTER 语句(例如垃圾邮件/病毒扫描),它将覆盖该 FILTER 语句(如果它们发生在 smtpd_sender_restrictions 之后)。