Назад | Перейти на главную страницу

Как я могу заставить exim доставлять одну входящую почту нескольким местным почтовым адресам?

Я обслуживаю IMAP-сервер под управлением FreeBSD, который использует exim 4.80 в качестве своего MTA. Прямо сейчас я пытаюсь создать псевдоним электронной почты, чтобы я мог обращаться ко всем пользователям системы и информировать их о запланированных простоях и т.п. Идея в том, что письмо на vmailusers@imap.mydomain.com должны быть отправлены всем пользователям в системе.

Сначала я подумывал о простом простом /etc/aliases но заметил, что это не то, что я хочу, поскольку у пользователей системы могут быть фильтры Sieve, которые отбрасывают все входящие письма, кроме нескольких из белого списка.

Я заметил, что exim можно настроить для доставки в локальный каталог Maildir сразу (минуя любые другие MDA и, таким образом, обходя фильтры Sieve), используя добавление файлового транспорта - но как я могу сделать одну входящую почту на vmailusers перенаправить на множественный местные мейлдиры?

Вы можете использовать маршрутизатор перенаправления для обработки сообщений псевдонима. Это также тот, который запускает скрипты / пересылает файлы, предоставленные пользователями. Обработка маршрутизаторов происходит сверху вниз, поэтому пример ниже работает примерно так:

  1. В syswide_alias маршрутизатор проверяет псевдонимы в /etc/aliases файл. Если он обнаружен, последовательность маршрутизации возобновляется.
  2. Force_delivery выполняет ту же проверку, но на этот раз использует original_local_part переменная, которая пуста, если пересылка не выполнялась. Если поиск успешен, сообщение доставляется. В этом случае обработка останавливается (поскольку доставка была выполнена), поэтому любые фильтры или пересылки, которые мог иметь пользователь, игнорируются.
  3. Если forced_delivery маршрутизатор отказывается, .forward файл будет обработан. Если этот файл содержит псевдонимы, последовательность маршрутизации перезапускается.
  4. Наконец, сообщение доставляется в почтовый ящик пользователя. Это произойдет только в том случае, если файл фильтра на предыдущем шаге не привел к значительной доставке (то есть он не содержит псевдонима пересылки или не отбрасывает сообщение полностью).

В routers раздел должен выглядеть так:

syswide_alias:
    driver = redirect
    allow_defer
    allow_fail
    data = ${lookup{$local_part}lsearch{/etc/aliases}}

forced_delivery:
    driver = accept
    allow_defer
    transport = local_delivery
    condition = ${if eq {${lookup{$original_local_part}lsearch{/etc/aliases}}}{}{no}{yes}}

user_filters:
    driver = redirect
    allow_defer
    allow_fail
    allow_filter
    file = ${home}/.forward

normal_delivery:
    driver = accept
    check_local_user
    transport = local_delivery

Оба syswide_alias и forced_delivery маршрутизаторы имеют allow_defer опция, которая нужна, если файл не найден (что, вероятно, не так, но все равно не повредит)

Редактировать: Приведенный выше пример теперь содержит полный набор маршрутизаторов, необходимых для достижения поставленных целей.