это немного нечеткая вещь, которую я пытаюсь решить, поэтому мне нужно попросить вас о помощи.
Наши пользователи разделены между двумя большими зданиями, которые находятся далеко друг от друга, поэтому мы установили два независимых почтовых сервера, чтобы каждый сервер обслуживал почту для своего здания. Основная цель заключается в том, чтобы в случае потери связи пользователи могли отправлять почту своим коллегам в собственном здании, даже если внешняя почта временно недоступна. Каждое здание использует свой собственный почтовый домен. Настройка тривиальна и работает нормально.
Для борьбы со спамом, а также для административных целей у нас есть одна и та же (вся) таблица пользователей на каждом сервере, но каждое поле помечено как «B1» или «B2», чтобы указать, в каком здании находится данный пользователь. Мы использовали для хранения таблиц почтовых ящиков и перенаправлений в таблицах SQL, поэтому не проблема их различать, добавляя условие «WHERE which_server = 'B1'» в строки конфигурации exim.
Что было неожиданным, так это дублирование почты, когда мы дошли до перенаправлений / псевдонимов. Вот пример:
Скажем, пользователь user1 в корпус 1 использует почтовый ящик user1@b1.domain.com, а пользователь user2 в корпус 2 использует почтовый ящик user2@b2.domain.com. Пока нет проблем, они могут отправлять друг другу письма, а внешние пользователи также могут связываться с ними по почте.
Давайте теперь представим, что мы добавляем несколько перенаправлений на каждый почтовый сервер. Скажи так:
user2@b2.domain.com -> user2@b2.domain.com, user3@b2.domain.com, foobar@gmail.com
Теперь, когда почта от user1@b1.domain.com поступает на user2@b2.domain.com, почтовый сервер на server1 сделает три копии и отправит дальше в виде трех отдельных сообщений (два g отправятся на сервер b2.domain.com, одно перейдет на серверы Gmail). Теперь, когда эти сообщения приходят на сервер b2.domain.com, он снова выполняет перенаправление (используя свои собственные таблицы SQL), таким образом дублируя сообщения.
Мне кажется, я упускаю какой-нибудь изящный способ решить эту проблему, не могли бы вы указать мне правильный путь?
Заранее спасибо!
У вас есть один мощный индикатор, который вы не используете при анализе расширения таблицы псевдонимов: приходит ли электронное письмо из внешнего мира или из другого здания (одно или несколько имен хостов или 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}}
При такой логике предположительно следующие маршрутизаторы - это те, которые обрабатывают доставку в почтовый ящик и доставляют это сообщение локально.
Если все работает должным образом, сделайте обратное в другом здании.
Кажется, ваша основная проблема заключается в несовместимой почтовой среде. С одной стороны, вы относитесь к двум серверам как к идентичным внутренним серверам (одинаковые правила псевдонимов), с другой стороны, они несут ответственность только за один домен, что заставляет их относиться друг к другу как к любому другому удаленному почтовому серверу, поэтому дублирование перенаправления неизбежно .
Вместо того, чтобы пытаться обрабатывать эту распределенную настройку на уровне маршрутизации MTA, я бы предложил вам предоставить обоим серверам одинаковую конфигурацию домена, что означает, что оба сервера будут рассматривать оба ваших домена как локальные и доставлять их в локальные почтовые ящики, а затем реплицировать эти почтовые ящики между серверы, например, используя dovecot's репликация мастер-мастер