Обратный адрес, который сам себя объясняет

Кто, что и когда — прямо в адресе конверта

Задача. Отказ или жалоба приходит через несколько дней после отправки. Понять, какого клиента, рассылки и получателя они касаются, — значит разбирать отчёт, формат которого у каждого приёмника свой, или прочесть адрес, на который он пришёл.

Из чего складывается:

  • <bounce-processor> — опознаёт отчёт об отказе и пишет запись rb;
  • verp — свой обратный адрес на каждого получателя;
  • <feedback-loop-processor> — то же для жалоб, по своему списку адресов;
  • job-header — метка рассылки в записях учёта.

Области у составляющих разные. Обработчики — уровня узла, их списки сверяются с адресом, на который пришло письмо; смена списка обработчика отказов требует перезапуска. Оба требуют, чтобы узел эту почту принимал: для жалоб — быть MX домена жалоб.

Как они взаимодействуют. Уникальный адрес на письмо руководство советует прямо — вроде customer1-campaign563-uniqueID498294@bounce.yourdomain.com, — и мысль обобщается: такой адрес сам называет рассылку и получателя, и опознание становится поиском, а не толкованием. VERP порождает такие адреса сам, так что две половины схемы — одно решение с разных концов: на подаче и на приёме. Разнообразия форматов схема не отменяет: опознание надёжно, разбор — нет, поэтому неопознанные отчёты стоит сохранять.

Главная ловушка — пересекающиеся списки обработчиков. Обработчик отказов работает раньше обработчика жалоб: адрес, подходящий под оба списка, заберёт первый, и жалобы молча станут «отказами».
Что делает Хаб. Применяет наполовину. Обработчики на узле стоят: отказы принимаются на bounce@bounce.<домен> (переписывание обратного адреса включается галочкой в генераторе), жалобы — на fbl@fbl.<домен>, и разобранные записи уходят вебхуком в Хаб. Но обратный адрес один на домен: VERP не включён, а метку рассылки Хаб не доносит — process-x-job false. Получателя он берёт из поля записи учёта, а не из адреса.
Рекомендуемые значения

Что даёт каждая часть:

Часть Где задаётся Что появляется
список адресов отказов <bounce-processor> записи rb
VERP подача письма уникальный обратный адрес на получателя
список адресов жалоб <feedback-loop-processor> записи f
задание заголовок x-job и process-x-job поле jobId
Порядок обработчиков, перезапуск при смене списка, совет про уникальный адрес и VERP — из руководства (§ 13.6, § 13.7, § 7.4.4, § 13.8). Сама схема — наша гипотеза.
Пример в конфигурации
<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>
Списки не пересекаются: bounce. и fbl. — разные поддомены; после смены списка отказов нужен перезапуск.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Как проверить на узле
Проверить, что отчёты опознаются:
grep -c '^rb,' /var/log/pmta/acct-*.csv
Ноль при приходящих отчётах — адрес не совпал со списком или вид rb не выбран в records.