Задача. Отказ или жалоба приходит через несколько дней после отправки. Понять, какого клиента, рассылки и получателя они касаются, — значит разбирать отчёт, формат которого у каждого приёмника свой, или прочесть адрес, на который он пришёл.
Из чего складывается:
Области у составляющих разные. Обработчики — уровня узла, их списки сверяются с адресом, на который пришло письмо; смена списка обработчика отказов требует перезапуска. Оба требуют, чтобы узел эту почту принимал: для жалоб — быть MX домена жалоб.
Как они взаимодействуют. Уникальный адрес на письмо руководство советует прямо — вроде customer1-campaign563-uniqueID498294@bounce.yourdomain.com, — и мысль обобщается: такой адрес сам называет рассылку и получателя, и опознание становится поиском, а не толкованием. VERP порождает такие адреса сам, так что две половины схемы — одно решение с разных концов: на подаче и на приёме. Разнообразия форматов схема не отменяет: опознание надёжно, разбор — нет, поэтому неопознанные отчёты стоит сохранять.
Что даёт каждая часть:
| Часть | Где задаётся | Что появляется |
|---|---|---|
| список адресов отказов | <bounce-processor> | записи rb |
| VERP | подача письма | уникальный обратный адрес на получателя |
| список адресов жалоб | <feedback-loop-processor> | записи f |
| задание | заголовок x-job и process-x-job | поле jobId |
<bounce-processor> <address-list> address /^b-[a-z0-9-]+@bounce\.example\.com$/ </address-list> </bounce-processor> <feedback-loop-processor> <address-list> address /^fbl@fbl\.example\.com$/ </address-list> </feedback-loop-processor>
grep -c '^rb,' /var/log/pmta/acct-*.csv