Как собирать отскоки в postfix

15

Это связано с этим вопросом:

linux - способы получить отчет о возврате для моего информационного бюллетеня? - Ошибка сервера

Допустим, я генерирую адреса электронной почты, подобные этому, когда я отправляю новостные рассылки, чтобы идентифицировать отказов, и отписываюсь от них в моей новостной рассылке: bounce-123456789@example.com

Я предполагаю, что использовал бы это в обратном пути, верно?

Тогда как мне настроить его в postfix, чтобы собрать все эти адреса с префиксом «bounce-» в один почтовый ящик?

Наконец, я слышал, что люди упоминают мягкий отскок против жесткого. Может ли кто-то объяснить разницу и как они должны рассчитывать, чтобы знать, когда навсегда удалить кого-либо из бюллетеня электронной почты?

Брайан Армстронг
источник
Обратите внимание, что адрес электронной почты, который включает в себя слово «bounce», может также рассматриваться как «гадость» ... (спам) - при этом, если вы можете вставить свой собственный Message-Idв заголовок, он должен быть отправлен обратно, и это будет хватит проверять кто есть кто.
Алексис Вилке

Ответы:

17

Точный ответ на ваш вопрос (обработка bounce-xxx@example.comадреса) зависит от того, как настроен ваш сервер для получения почты. Если example.comэто виртуальный домен, лучшее, что вы можете сделать, это собрать сообщения в bounce@example.comпочтовый ящик (при условии recipient_delimiter = -).

Если example.comэто локально доставленный домен для сервера (почта доставляется фактическим системным учетным записям), то вы можете добавить .forwardфайл в домашний каталог bounceпользователя, который доставляет программу, которая анализирует информацию о сбое и записывает ее в базу данных или файл. , Смотрите man localдля получения дополнительной информации о .forwardформате и как доставить в программу.

То, что мы делаем, поскольку мы отправляем сообщения для большого количества доменов, это использование в bounces.example.comкачестве нашего домена VERP. Этот домен необходимо добавить в relay_domains. Создать /etc/postfix/transport_mapsс этим содержанием:

bounces.example.com             bulkbounce:

Затем добавьте строку, похожую на эту /etc/postfix/master.cf:

сыпучий Unix - nn - - труба
  user = nobody argv = / usr / local / bin / bounce_handler.py $ {получатель}

bounce_handler.pyСкрипт принимает адрес VERP в качестве своей опции командной строки, анализирует его и делает необходимые обновления базы данных для записи отказов.

Insyte
источник
Ох, мне нравится идея использовать разделитель получателей для их группировки. Как правило, + используется правильно? Я думаю, что это будет отлично работать, спасибо!
Брайан Армстронг
11

На самом деле, ответ Instyle очень сложно реализовать, если вы хотите поддерживать много разных доменов, и он неправильный, потому что:

а) По его примеру transport_maps, все электронные письма, отправленные на этот домен, отправляются в эту конкретную службу, независимо от того, являются ли электронные письма отклоненными. Поскольку он использует конкретное доменное имя, на самом деле это должны быть только отклоненные электронные письма ... но это не может быть гарантировано таким образом.

б) Данные, отправленные в ваш сценарий, являются самим электронным письмом, а не сообщением об отказе. Другими словами, ваш код может не иметь представления о том, почему электронное письмо было отклонено (т. Е. Локальное восстановление отправит вам только оригинальное письмо).


Правильный способ сделать эту настройку в postfix - использовать класс уведомлений об отказе.

1) В /etc/postfix/main.cf

notify_classes = bounce
bounce_notice_recipient = bounces@example.com
transport_maps = hash:/etc/postfix/transport_maps

2) В / etc / postfix / transport_maps

# when you make changes to this file, run:
#   sudo postmap /etc/postfix/transport_maps
bounces@example.com bulkbounce:

Как вы можете видеть, теперь мы говорим postfix использовать bounces@example.comкаждый раз, когда письмо получает отказ. Затем в транспортной карте, чтобы использовать bulkbounceв качестве службы для обработки любого адреса электронной почты bounces@example.com.

Наконец, вы можете определить bulkbounceс помощью вашего скрипта:

3) В /etc/postfix/master.cf

bulkbounce unix -       n       n       -       -       pipe
  flags=FRq user=bounce argv=/home/bounce/bin/snapbounce --sender ${sender} --recipient ${recipient}

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

useradd bounce

Без сценария master.cfписьма отправляются на учетную запись. Так что если у вас есть скрипт , который разбирает письма из файлов, это будет работать без transport_mapsи master.cfизменений.


Из комментария ниже:

fyi - re: double bounces ...
если вы изменяете адрес возврата (адрес VERP, такой как user+id@fromdomain.com, то вы захотите закомментировать строку main.cfдля bounce_notice_recipient, если вы заинтересованы в парсинге +idbounce только в вашем скрипте.

Алексис Уилке
источник
Используя ваш способ, я каким-то образом получаю отскок дважды, один раз с bounce + id @ ... и один раз с bounce @ ... от double-bounce - (отказов пользователя на самом деле не существует в системе - так как я не собираюсь «сохранить» эти письма). Письмо отправлено с Return-path of bounce + id @ ... Есть идеи, что мне не хватает?
RVandersteen
@RVandersteen Я не слишком уверен, почему ты получишь это дважды. Тот, у кого +id@может быть какой-то конверт?
Алексис Вилке
Когда я использую наш адрес отправителя по умолчанию - отскок по-прежнему отправляется на bounce@example.com и originalfrom@example.com (путь возврата больше не добавляется)
RVandersteen
1
Для дальнейшего использования добавление notify_classes не меняет поведение MTA, отправляющего сообщение о сбое в FROM / Return Path. Он добавляет поведение поверх него (отправляет его также в notify_bounce_recipient). Вот почему мне приходили двойные письма. Что отвечает на мой вопрос (ы) выше
RVandersteen
1
fyi - re: double bounces..Если вы изменяете адрес возврата (адрес VERP, такой как 'user+id@fromdomain.com', тогда вы захотите закомментировать строку в main.cf для 'bounce_notice_recipient', если вы заинтересованы в синтаксическом анализе отказов + id только в вашем скрипте
sarora
1

Большинство современных программ для рассылки уже знают, как обрабатывать сообщения VERP, если MTA правильно настроен для передачи их обратно в программу рассылки. В случае GNU Mailman вы должны зайти на страницу часто задаваемых вопросов, которая называется «Как мне использовать VERP с разделителем - (Postfix receient_delimiter)?».

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

Джереми Бауз
источник
Да, я делаю свое собственное программное обеспечение для рассылки новостей. Есть веская причина!
Брайан Армстронг
Тогда вы должны посмотреть на использование VERP для правильной обработки отскоков.
Джереми Бауз
Привет, Джереми, я думаю, что ты прав. VERP - это стандартное решение, хотя кажется, что полезно только определить отправителя и получателя. В этом случае нам также необходимо идентифицировать конкретное сообщение, которое вызвало отскок, поэтому я считаю, что нам нужно будет сделать собственное решение с нашим собственным идентификатором в адресе. Я думаю, что решение, упомянутое ниже с использованием разделителя получателей, позволит нам сгруппировать их в одну учетную запись отказов. Спасибо за ответ, хотя я ценю помощь!
Брайан Армстронг
Решение Insyte - это просто модифицированный VERP по своей сути. Вам просто нужно убедиться, что он предоставляет достаточно уникального идентификатора для вашего обработчика отказов, чтобы идентифицировать его. В большинстве программ списков рассылки это адрес электронной почты, но он может быть любым, поскольку вы разрабатываете свой собственный.
Джереми Бауз