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

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

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

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

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

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

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

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

(а) В файле /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) Сделать сценарий ретранслятора исполняемым пользователем (конвейером), указанным в 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

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

Правильный способ сделать это - создать новый транспорт в 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:

Прочтите документы postfix, здесь должно быть более подробное объяснение. Надеюсь это поможет.