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