这是一个模糊的东西,我试图解决,所以我需要问你的帮助。
我们的用户被划分为两个彼此远离的大型build筑物,因此我们build立了两个独立的邮件服务器,每个服务器为其build筑物提供邮件。 主要目的是在连接失败的情况下,即使外部邮件暂时不可用,用户也可以在自己的build筑物内邮寄同事。 每个build筑物都使用自己的邮件域。 设置是微不足道的,工作正常。
为了防止垃圾邮件和为了pipe理目的,我们在每个服务器上都有相同的(全部)用户表,但每个框都标记为“B1”或“B2”,以指示给定用户位于哪个build筑物。 我们用来存储邮箱和redirect到SQL表中的表,所以没有任何问题可以通过在eximconfiguration行中添加“WHERE which_server ='B1'”条件来区分它们。
当我们来redirect/别名时,意外的是邮件重复。 这是一个例子:
假设楼1中的用户user1使用邮箱[email protected] ,而楼2中的用户user2使用邮箱[email protected]。 目前没有问题,他们可以互相发送邮件,外部用户也可以通过邮件联系他们。
现在让我们想象一下,在每个邮件服务器上添加一些redirect。 像这样说:
[email protected] – > [email protected],[email protected],[email protected]
现在,当来自[email protected]的邮件进入[email protected]时,server1上的邮件服务器将做出它的三个副本并作为三个单独的消息进一步发送(两个gwill去b2.domain.com的服务器,一个将转到Gmail的服务器)。 现在,当这些消息到达b2.domain.com的服务器时,它将再次执行redirect(使用它自己的SQL表),从而复制消息。
我费我想念一些优雅的方式来解决这个问题,所以请你指出正确的方式?
提前致谢!
在分析别名表扩展时,你有没有使用一个强大的指标:电子邮件是来自外部世界,还是来自其他build筑物(一个或多个主机名或IP)。 如果问题是B1中的别名扩展在从B2发送时以重复的方式失败,那么如果源为B2,则跳过别名扩展。 在一个ACL中,这将通过hosts = !+B2来完成,但是在你的情况下,路由器是你需要做出这个决定的地方。 为了做到这一点,我将在连接ACL或邮件ACL中设置:
warn hosts = +B2 set acl_c_other_building = 1
然后在别名路由器中,可以添加如果来自其他build筑物的情况,则返回false / no:
condition = ${if eq{$acl_c_other_building}{1} {no}{yes}}
有了这个逻辑,大概下面的路由器是那些处理邮箱递送并将在本地递送该消息的路由器。
如果它按预期工作,则在另一栋build筑物中做相反的处理。
您的主要问题似乎是不一致的邮件环境。 一方面,您将两台服务器视为相同的内部服务器(相同的别名规则),另一方面,它们只负责一个域,这使得它们像其他任何远程邮件服务器一样相互对待,所以redirect重复必然会发生。
我不build议在MTA路由级别上处理这个分布式设置,而是build议您给两台服务器提供相同的域configuration,这意味着两台服务器都将本地域视为本地域,然后交付给本地邮箱,然后将这些邮箱复制到服务器,例如使用dovecot的主 – 主复制