Как пересылать на динамически определяемые адреса с помощью 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:
Читайте в постфиксных документах, здесь должно быть более подробное объяснение. Надеюсь это поможет.