我如何(自动)重新尝试从不同的 Postfix 服务器传递邮件?

我如何(自动)重新尝试从不同的 Postfix 服务器传递邮件?

我的网络由两个不同的位置组成,在这两个位置上我都运行着一个 Postfix 服务器来发送邮件。邮件将以循环方式提交给这两个服务器中的任何一个,这取决于它们是否都在 DNS 中,例如smtp.mydomain.tld指向两个 A 记录。用户在那里提交邮件,然后这些服务器将发送邮件。到目前为止,一切都很顺利。

现在,有时会发生无法到达下一个邮件服务器的情况,两个网络。例如,假设 (VPS) 主机 smtp1 由云提供商 A 托管在欧盟,而 smtp2 由云提供商 B 托管在美国。example.com由于某些网络问题或接收方对 smtp1 的 ASN 级别阻止,向域上的收件人提交的邮件有时只能通过 smtp2 传递。这可能是 TCP 连接超时、临时 SMTP 错误(其中的消息提到了我们的网络/位置被禁止等)。- 我在这里看到了很多不同类型的故障。

两个位置之一的交付失败图

在实践中,我看到邮件主机根据以下情况进行阻止/限制出现基于地理位置,例如美国机构的邮件服务器仅允许来自美国的连接。

到目前为止,我尝试过的方法是手动将这些邮件从/var/spool/postfix目录中“移植”到其他主机。这种方法很有效。但尝试自动执行此操作似乎非常复杂。

我还尝试过为已知不良的收件人域设置传输覆盖。然后,它们将被转发到已知良好的传出 smtp 服务器,以便顺利交付,而不是尝试直接交付到互联网。但是,在单个主机上维护列表很麻烦,并且需要先从用户那里获得信号,并确认什么是已知良好的路径。

我想要实现的是将这些有问题的排队消息自动“移植”到其他出站 SMTP 服务器,以便从那里重试传送。但是,我觉得这似乎是一个复杂的补丁,而设计中应该修复一些问题。

理想情况下,我希望为可能大量的外发邮件服务器提供一个共享的外发邮件队列(数据库?)。然后,该集群将尝试依次传递邮件,直到成功。我只是找不到任何非本地目录“后端”作为 Postfix 的消息队列 - 它似乎真的仅限于单个主机。

答案1

配置你的 postfix 服务器以允许它们互相中继,然后将它们的计数器添加到smtp_fallback_relay列表。

这应该是 Postfix 原生的方式,以确保在第一次投递尝试因非永久性错误而失败后,原始 SMTP 消息将被转发到您的备用邮件中继进行第二次投递尝试。

如上所述,当您的目的地(很多)使用灰名单

smtp_fallback_relay (default: $fallback_relay)
当未找到 SMTP 目标或由于非永久性错误导致传送失败时,将使用的可选中继目标列表。在 Postfix 2.2 及更早版本中,此参数称为fallback_relay

默认情况下,smtp_fallback_relay 为空,当找不到目的地时,邮件将返回给发件人,并且由于非永久性错误导致邮件失败后将推迟投递。

对于批量电子邮件投递,在同一主机上运行后备中继 MTA 可能会很有帮助,这样它就可以重用发件人的 IP 地址。这可以加快因基于 IP 的信誉系统而延迟的投递速度(灰名单, ETC。)。

后备中继必须是 SMTP 目标。指定domainhosthost:port[host]:port或;该表单将关闭 MX 查找。如果您指定多个 SMTP 目标,Postfix 将按指定顺序尝试它们[address][address]:port[host]

为了防止 MX 主机和后备主机之间出现邮件循环,Postfix 2.2 及更高版本将不会对其作为 MX 主机的目的地使用后备中继(假设 DNS 查找已打开)。

相关内容