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

Как настроить Postfix на рассылку писем только с определенным заголовком?

Я настраиваю локальную виртуальную машину для разработки, и мне удалось перенаправить все электронные письма отправлялись в локальный почтовый ящик, используя virtual_alias_maps с записью /.*/ username.

Я бы хотел добавить возможность не перенаправлять электронные письма в локальный почтовый ящик если электронное письмо содержит определенный заголовок.

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

Как я смогу добиться этого с помощью Postfix?

Большое спасибо за твою помощь!

Удаление псевдокода из tpml7

if header exist (postfix will checks via header_cheks)
    no rewrite --> different instance
else
    rewrite with virtual_alias_maps same instance

Постфикс AFAIK может перенаправлять электронную почту, если существует определенный заголовок. См. Функцию REDIRECT на человек header_checks.

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

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


Для этого вам понадобится два мультиэкземпляра. Первый экземпляр выполняет header_checks, Второй экземпляр выполняет нормальные исходящие сообщения.

В первом экземпляре будет два демона smtpd, определенных в master.cf. Один демон (по умолчанию) слушает *: 25, второй - 127.0.0.1:12525.

Второй экземпляр будет прослушивать 127.0.0.1:22525

Первый случай

##main.cf

# your header filter
header_checks = pcre:/path/to/header_checks

# no rewriting
receive_override_options = no_address_mappings

# send to second instance
relayhost = [127.0.0.1]:22525
virtual_alias_maps = pcre:/your/catch-all

##master.cf

# second smtpd but with rewriting enabled
[127.0.0.1]:12515 inet  n       -       n       -       -       smtpd
    -o receive_override_options=

# /path/to/header_checks
/^MyHeader/  FILTER smtp:[127.0.0.1]:12525

Второй экземпляр

Просто настройте как первый экземпляр постфикса без header_checks, relayhost, virtual_alias_maps и receive_override_options (обычная установка постфикса). Установите master.cf так, чтобы он слушал только [127.0.0.1]: 22525. Устанавливать myhostname так что с первым экземпляром все будет иначе.

Сначала мы определяем два процесса smtpd в master.cf, один с включенной перезаписью, а другой с отключенной перезаписью. SMTPD с включенной перезаписью по умолчанию существует в master.cf. Теперь мы сделаем эти строки

127.0.0.1:2525 inet n  -       n         -       2000     smtpd
    -o receive_override_options=no_header_body_checks,no_address_mappings

Это включит другой процесс smtpd

  • Прослушивание порта localhost IP-порт 2525
  • С функцией header_checks и отключенной функцией перезаписи.

Здесь псевдокод вашего запроса

if header exist (postfix will checks via header_cheks)
    no rewrite 
else
    rewrite with virtual_alias_maps

Мы реализуем эту логику с помощью header_checks.

Добавьте эту строку в main.cf

 header_checks = regexp:/etc/postfix/mycustomheader

Содержание /etc/postfix/mycustomheader

/^X-Your-Header/  FILTER smtp:[127.0.0.1]:2525

Как это устроено

Каждый раз, когда postfix обнаруживает X-Your-Header в ваших сообщениях он будет перенаправлять электронную почту второму процессу smtpd, как мы определили ранее. Если заголовок не существует, ваша электронная почта будет проходить через процесс smtpd по умолчанию с включенной перезаписью.