Рейтинг:0

How to add a single header for any incoming mail with Postfix?

флаг id

I have Postfix running with a number of smtpd processes configured in master.cf like this:

# Internet facing one
1.2.3.4:25      inet  n       -       y       -       -       smtpd
  -o ...   # internet-only overrides

# Internal facing one
10.0.0.1:10026      inet  n       -       y       -       -       smtpd
  -o ...   # internal-only overrides

Now, I'd like to add a single header, with static name and value, to incoming mail depending on which smtpd it was received on.

Example:

X-Gert-Postfix-Received-From: the evil internet

My options considered:

  1. Add the header_checks option and use the PREPEND action in the file.

    Nearly there, but:

    • It requires to match an existing header and will then add one more on subsequent matches.
    • I don't always have a certain header present already, perhaps even a From is missing, for example.
    • In case you have existing header_checks, there's no easy way to stack two header_check files, I think.
  2. Build a custom app that uses the Milter protocol and hook that up to Postfix with smtpd_milters.

    Of course, this will work. I can inspect the mail in my own app, then inject the header there. Seems over-engineering for a simple task like adding a header. Additionally, it requires extra maintenance with the need to run another daemon app, quite some boilerplate code, etc.

  3. As suggested in a comment, use check_recipient_access (related Q).

    Same downsides as header_checks (see 1).

I feel like I'm missing something simple. Anyone got a better idea?

флаг in
Отвечает ли это на ваш вопрос? [Добавить пользовательский заголовок в Postfix с ретранслируемым доменом](https://serverfault.com/questions/693904/add-a-custom-header-to-postfix-with-the-relayed-domain)
флаг id
@GeraldSchneider Боюсь, не совсем так, check_recipient_access имеет тот же недостаток, что и header_checks.
anx avatar
флаг fr
anx
Параметры постфикса, определяющие таблицы поиска, представляют собой просто списки ссылок `тип:имя`, разделенные запятыми/пробелами, поэтому *есть* простой способ их сгруппировать. Я собирался предложить использовать это в сочетании с `always_add_missing_headers=yes`, но я не уверен, является ли это полным ответом (поскольку документация в некоторых местах звучит так, будто `очистка` добавляет отсутствующие заголовки только один раз *после* обработки `header_checks` )
Рейтинг:0
флаг fr
anx

Чтобы обойти ограничения smtpd_*_restrictions:

Сообщение — даже с нулевым отправителем — имеет только одного отправителя конверта. Так что используйте check_sender_access вместо check_recipient_access. Используемый тип поиска может быть статический: потому что нас не волнует специфика обратного пути. Добавьте его в свой список smtpd_sender_restrictions перед созданием каких-либо проверок. ПРИНИМАТЬ результаты (постфикс не будет запрашивать дополнительные поисковые запросы).

# в main.cf
common_sender_restrictions =
  reject_non_fqdn_sender
  reject_unknown_sender_domain
  ..
internet_sender_restrictions =
  $ common_sender_restrictions
  check_sender_access static:{PREPEND X-Gert-Postfix-Received-From: злой интернет}

# в master.cf
192.0.2.0:25 инет п-у-- smtpd
 -o smtpd_sender_restrictions=$internet_sender_restrictions
10.0.0.1:10026 инет п-у-- smtpd
 -o smtpd_sender_restrictions=$common_sender_restrictions
флаг id
Звучит очень интересно и красиво. Позвольте мне попробовать это позже!
Рейтинг:0
флаг in

Если у вас есть существующие файлы header_check, я думаю, нет простого способа сложить два файла header_check.

На самом деле существует способ иметь несколько независимых файлов header_checks для каждого демона.

каждый Опция в файле master.cf переопределяет значение по умолчанию или любой параметр конфигурации постфикса в файле main.cf. Чтобы иметь разные header_checks для каждого демона (например, /etc/postfix/header_checks1 и /etc/postfix/header_checks2), вы должны переопределить каждый header_checks параметр:

# Интернет лицом к лицу
1.2.3.4:25 инет п-у-- smtpd
-o header_checks = регулярное выражение:/etc/postfix/header_checks1

# Внутренняя сторона одна
10.0.0.1:10026 инет п-у-- smtpd
-o header_checks = регулярное выражение:/etc/postfix/header_checks2

Таким образом, у вас будет полностью независимый header_checks файлов на демон smtpd. Оттуда вы можете добавить правила, которые предшествуют тегу, о котором вы говорили.

флаг id
Я рассматривал это, но, как я уже сказал: 1) это переопределяет мои общие header_checks. 2) все минусы header_checks в целом. Мне приходят электронные письма из ненадежных источников, например, из всемирной сети Интернет. Не уверен, как это ответ на мой вопрос, учитывая, что это уже есть в моем вопросе.
флаг id
Чтобы было ясно; если у вас есть общая логика в `header_checks` `main.cf`, то переопределение в `master.cf` маскирует ее. Это особенность, но недостаток/проблема в данном случае.
FatRabbit avatar
флаг in
если вам нужны общие header_checks для обоих демонов, просто добавьте их обратно в оба «переопределения», вы можете иметь столько header_checks, сколько хотите, просто перечислите их. master.cf не поддерживает пробелы, поэтому вам нужно сохранить список ваших файлов header_checks в переменной.

Ответить или комментировать

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