我试图解决的问题有点模糊,所以我需要向您寻求帮助。
我们的用户分布在两个相距很远的大楼里,所以我们设置了两个独立的邮件服务器,每个服务器都为其大楼提供邮件。主要目的是在连接丢失的情况下,即使外部邮件暂时不可用,用户也可以在自己的建筑物内给他们的同事发邮件。每个建筑物都使用自己的邮件域。设置很简单,工作正常。
出于打击垃圾邮件的目的以及出于管理目的,我们在每台服务器上都有相同的(整个)用户表,但每个框都标记为“B1”或“B2”以指示给定用户所在的建筑物。我们曾经将邮箱表和重定向表存储在 SQL 表中,因此通过在 exim 配置行中添加“WHERE which_server='B1'”条件来区分它们是没有问题的。
当我们谈到重定向/别名时,出乎意料的是邮件重复。这是示例:
假设1 号楼的用户user1使用邮箱[email protected] ,而2号楼的用户user2使用邮箱 [email protected] 。到目前为止没问题,他们可以互相发送邮件,外部用户也可以通过邮件联系他们。
现在让我们假设我们在每个邮件服务器上添加一些重定向。这么说:
[email protected] -> [email protected], [email protected], [email protected]
现在,当来自 [email protected] 的邮件发送到 [email protected] 时,server1 上的邮件服务器将复制三个副本并作为三个单独的消息进一步发送(两个 g 将发送到 b2.domain.com 的服务器,一个将转到 Gmail 的服务器)。现在,当这些消息到达 b2.domain.com 的服务器时,它将再次进行重定向(使用它自己的 SQL 表),从而复制消息。
我觉得我想念一些优雅的方法来解决这个问题,所以请你指出正确的方法吗?
提前致谢!
在分析别名表扩展时,您确实有一个没有使用的强大指标:电子邮件是来自外部世界,还是来自其他建筑物(一个或多个主机名或 IP)。如果问题是 B1 中的别名扩展在从 B2 发送时以重复的方式失败,那么如果源是 B2,则跳过别名扩展。在 ACL 中,这将通过 来完成
hosts = !+B2
,但是在您的情况下,路由器是您需要做出此决定的地方。为此,我将在连接 ACL 或邮件 ACL 中设置:然后在别名路由器中,您可以添加条件,如果它来自其他建筑物,则返回 false/no:
有了这个逻辑,下面的路由器大概就是那些处理邮箱传递并将在本地传递该消息的路由器。
如果它按预期工作,请在另一栋建筑物中执行相反的操作。
您的主要问题似乎是邮件环境不一致。一方面,您将两台服务器视为相同的内部服务器(相同的别名规则),另一方面,它们只对一个域负责,这使得它们像任何其他远程邮件服务器一样相互对待,因此重定向重复必然会发生.
与其尝试在 MTA 路由级别处理这种分布式设置,我建议您为两台服务器提供相同的域配置,这意味着让两台服务器都将您的域都视为本地并传送到本地邮箱,然后在这些邮箱之间复制这些邮箱服务器,例如使用 dovecot 的主-主复制