Как пересылать на динамически определяемые адреса с помощью Postfix?

Каждое сообщение для локального пользователя должно идти по адресу, полученному с помощью внешней команды. Эта команда будет проверять локальный адресный тег, выполнять вызовы API для нескольких процессов, а затем вычислять адрес назначения.

Например, мы могли бы использовать файл.forward в домашнем каталоге пользователя для передачи сообщения в команду (|command), которая также будет отвечать за пересылку сообщения. "Файл псевдонима или ~/.forward может содержать любую комбинацию внешних команд, имен файлов назначения, директив:include: или почтовых адресов". См.: www.postfix.org/local.8.html Также: www.postfix.org/aliases.5.html

Может быть, нужно только настроить заголовок To и повторно отправить сообщение через Postfix? Что-то говорит мне, что это не так просто. Самое простое было бы, если бы сам Postfix обрабатывал всю работу по пересылке, как это происходит, когда адрес назначения записывается непосредственно в файл.forward. Но адрес неизвестен; это может быть определено только командой. Это проблема.

Кроме того, если адрес назначения не может быть определен, то сообщение должно отскочить с уведомлением об ошибке, предоставленным командой.

Решение как реализовано

Это решение расширяет ответ Данилы. В частности, он перенаправляет почту для определенных пользователей вики, известных как "каналы" [2], вместо этого пересылая их "помощникам", назначенным в вики [1]. Но в целом это должно быть применимо к любому ретранслятору, где адрес назначения динамически определяется скриптом.

(a) В файле /etc/postfix/main.cf:

transport_maps = regexp:/etc/postfix/transport.regexp
# enable transport mapping based on regular expressions

minder_destination_recipient_limit = 1
# See SINGLE-RECIPIENT DELIVERY [3].  relay-to-minder (master.cf) can handle only a
# single recipient per delivery, and flags DO have the same limitation.

(b) В файле /etc/postfix/transport.regexp [4] выполните отображение транспорта:

if /^pipe\+.+@zelea\.com$/
# relay all deliveries for pipe users [2] ...
!/^pipe\+bounceSpam@/ minder:
# ... except 'bounceSpam' deliveries, via master.cf 'minder' service
endif

(c) В файле /etc/postfix/master.cf определите службу 'minder':

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
minder    unix  -       n       n       -       1       pipe
  flags=DO user=pipe argv=/usr/local/libexec/relay-to-minder ${sender} ${recipient}
# With maxproc 1 because it's sufficient, let Postfix do all queuing.
# Both flags D and O (adding headers Delivered-To and X-Original-To) require main.cf
# minder_destination_recipient_limit=1 [3]

(d) Сделать исполняемый скрипт-ретранслятор пользователем (pipe), указанным в master.cf user =. Содержимое сценария (включая последнюю версию этих заметок о конфигурации) находится по адресу http://zelea.com/system/host/havoc/usr/local/libexec/relay-to-minder

Сценарий повторно обращается к заголовкам назначения (все еще не уверен, что это правильно), повторно обращается к конверту и передает его обратно в MTA для окончательной доставки.

Заметки

[1] zelea.com/w/Property:Minder

[2] zelea.com/w/Category:Pipe

[3] Это значение "трубы" отличается от [2]. www.postfix.org/pipe.8.html

[4] www.postfix.org/transport.5.html | www.postfix.org/regexp_table.5.html

Пардон за ссылки. Я не заработал достаточно очков брауни.

1 ответ

Решение

Правильный способ сделать это - создать новый транспорт в master.cf

Что-то вроде этого:

myscript unix -  n  n   -  40   pipe
flags=R user=vmail argv=/path/to/myscript -o SENDER=${sender} -m USER=${user} EXTENSION=${extension}

Вы можете использовать свои собственные параметры.

Тогда вы можете использовать регулярное выражение для ваших правил улова

transport_maps = regexp:/etc/postfix/redirect_or_forward.regexp

Затем в /etc/postfix/redirect_or_forward.regexp

Что-то вроде:

 /^user-.*@mydomain\.com/   myscript:

Читайте в постфиксных документах, здесь должно быть более подробное объяснение. Надеюсь это поможет.

Другие вопросы по тегам