Як збирати відмов у postfix


15

Це пов’язано з цим питанням:

linux - Шляхи отримання звіту про зворотний відкат для моєї програми для розсилки новин? - Помилка сервера

Скажімо, я генерую такі адреси електронної пошти, коли надсилаю розсилки, щоб ідентифікувати відмов та скасувати підписку на свій інформаційний бюлетень: bounce-123456789@example.com

Я припускаю, що я використовував би це на зворотному шляху, правда?

Тоді як я встановив би його в postfix, щоб зібрати всі ці адреси з префіксом "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:

bulkbounce unix - nn - - труба
  user = none argv = / usr / local / bin / bounce_handler.py $ {отримувач}

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


О, мені подобається ідея використання деліметру одержувача для їх групування. Зазвичай + використовується правильно? Я думаю, що це буде чудово, дякую!
Брайан Армстронг

11

Насправді відповідь Instyle дуже важко реалізувати, якщо ви хочете підтримувати багато різних доменів, і це неправильно, оскільки:

а) На його прикладі transport_mapsвсі повідомлення електронної пошти, що надсилаються до цього домену, надсилаються до цієї конкретної служби, не зважаючи на те, чи надходять електронні листи чи ні. Оскільки він використовує конкретне доменне ім’я, він дійсно повинен бути лише відхиленими електронними листами ... але це не може бути гарантовано таким чином.

b) Дані, надіслані вашому сценарію, - це сам електронний лист, а не повідомлення відмов. Іншими словами, ваш код може не мати поняття, чому електронний лист відскочив (тобто місцевий відмов надсилатиме вам оригінальний електронний лист).


Правильний спосіб зробити це налаштування в 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:

Як бачимо, тепер ми повідомляємо, що постфікс потрібно використовувати 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: подвійний відмов ...
якщо ви змінюєте адресу повернення (VERP-адреса, наприклад user+id@fromdomain.com, ви хочете прокоментувати рядок main.cfдля bounce_notice_recipient, якщо вам цікаво проаналізувати +idвідмов лише у вашому сценарії.


Використовуючи ваш шлях, я якось отримую відмов двічі, один раз з відмов + id @ ... і один раз з відмов @ ... від подвійного відскоку - (відмов користувача насправді не існує в системі - як я не маю наміру "зберегти" ці електронні листи). Електронний лист надсилається із зворотним шляхом відмов + 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: подвійний відмов..якщо ви змінюєте адресу повернення (VERP-адреса, наприклад "user+id@fromdomain.com", тоді ви хочете прокоментувати рядок у main.cf для "bounce_notice_recipient", якщо вам цікаво
проаналізувати

1

Більшість сучасних програм зі списку розсилки вже знають, як обробляти VERP-повідомлення, якщо MTA належним чином налаштовано для передачі їх назад до програмного забезпечення списку розсилки. У випадку з GNU Mailman вам слід ознайомитись із сторінкою поширених запитань, влучно названою "Як я використовую VERP з роздільником (Postfix получатель_delimiter)?".

Якщо ви створюєте власне програмне забезпечення для розсилки новин для вирішення цього питання, ви повинні запитати себе, чому ви переосмислюєте колесо замість того, щоб використовувати наявні програми, які вирішують завдання просто та легко для вас уже.


Так, я створюю власне програмне забезпечення для розсилки новин. Є вагома причина!
Брайан Армстронг

Тоді ви повинні подивитися, як він використовує VERP для належного поводження з відскаками.
Джеремі Бууз

Привіт, Джеремі, я думаю, що ти маєш рацію. VERP - це стандартне рішення, хоча, здається, корисно лише визначити відправника та одержувача. У цьому випадку нам потрібно також визначити конкретне повідомлення, яке вийшло з-за відмов, тому я вважаю, що нам доведеться зробити власні рішення з власним ідентифікатором за адресою. Я думаю, що рішення, згадане нижче, використовуючи деліметр одержувача, дозволить нам об'єднати їх в один обліковий запис відмов. Дякую за відповідь, хоча я ціную допомогу!
Брайан Армстронг

Рішення Insyte - це лише модифікований VERP в основі. Вам просто потрібно переконатися, що він надає достатньо унікального ідентифікатора для вашого обробника відмов, щоб його ідентифікувати. У більшості списків розсилки програмне забезпечення, яке є адресою електронної пошти, але може бути чим завгодно, оскільки ви розробляєте своє.
Джеремі Буус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.