dsn-failed-body-template-from

Global

Файл, из которого берётся тело отчёта о неудаче
в конфигурации это строкаdsn-failed-body-template-fromвнутри блока Global
Тело отчёта берётся из файла, а не из строки

Значение — путь к файлу, а не сам текст: тело отчёта о неудаче слишком велико для строки конфигурации.

В шаблоне подставляются девять значений исходного письма:

Подстановка Что даёт
hostname имя узла, сформировавшего отчёт
originator отправитель исходного письма
recipient получатель, до которого не дошло
subject тема исходного письма
date дата формирования отчёта
timeQueued когда письмо встало в очередь
retryAfter интервал повторов
bounceAfter срок, после которого письмо отбивается
response ответ приёмника — то, ради чего отчёт и читают

Тем же набором пользуются соседние строки — шаблон темы dsn-failed-subject-template и шаблон заголовка отправителя dsn-failed-from-template.

Из девяти значений одно важнее прочих: ответ приёмника. Именно по нему человек понимает, что случилось, — остальное обрамление.

Главная ловушка — руководство пишет имя подстановки двумя способами. В перечне значений § 3.3.1.31 стоит hostname, в примере соседней строки — ${hostname}, а в самом образце тела из того же раздела — ${hostName}, с заглавной буквой. Два написания из трёх строчные; какое понимает MTA, проверяется только опытом.

Вторая половина мельче, но того же рода: в примере файл назван /usr/joe/dsn-body-template.txt, а заголовок следующего блока объявляет содержимое файла /usr/admin/dsn-body-template.txt. Пути разные, и это опечатка вендора.

Практический вывод один: шаблон проверять письмом, а не чтением. Неверная подстановка не вызовет ошибки — она просто останется в тексте как есть.

Что делает Хаб. Не пишет — и проявиться строка не может: suppress-local-dsn true, действующая во всех источниках подачи, выключает формирование отчётов вовсе.

Всё, что содержит отчёт, у нас приезжает записями учёта через вебхук: и ответ приёмника, и время постановки в очередь, и адреса. Оформлять эти данные письмом незачем.

Рекомендуемые значения

Что ставить. Путь к файлу; правила приходят из назначения:

Свойство Почему
файл рядом с конфигурацией читается процессом узла, и права нужны те же
ответ приёмника в тексте обязателен без него отчёт не объясняет ничего
без внутренних имён и адресов отчёт уходит наружу, отправителю письма

Сам файл читается при формировании отчёта, а не при загрузке конфигурации, — значит правка вступает в силу без перечитывания.

Перечень девяти подстановок, синтаксис и пример — из руководства, § 3.3.1.31. Расхождение в написании имени подстановки и в пути к файлу примера — наша находка. Требования к содержимому наши.
Пример в конфигурации
# три строки задают отчёт целиком: заголовок, тема и тело из файла
dsn-failed-from-template "${hostname} <postmaster@abc.com>"
dsn-failed-subject-template "Email failed, Re: ${subject}"
dsn-failed-body-template-from /etc/pmta/dsn-body-template.txt
Первые две строки несут текст прямо, третья — путь к файлу. Набор подстановок у всех трёх общий.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

Типичные ошибки и проблемы

что делают не так и чем это кончается2 ошибки▶

Полагаются на написание подстановки из текста руководства

§ 3.3.1.31

Чем чреватоОдно и то же значение названо в разделе двумя способами. Неверное написание не вызывает ошибки: подстановка остаётся в теле отчёта как есть, и получатель видит фигурные скобки вместо имени узла.
Как заметитьВ пришедшем отчёте видны сами имена подстановок.
Как правильноПроверить письмом на несуществующий адрес и оставить написание, которое сработало.

Кладут в шаблон внутренние подробности

наш опыт

Чем чреватоОтчёт уходит наружу — отправителю исходного письма, а им может оказаться кто угодно. Внутренние имена узлов и служебные адреса уезжают вместе с ним.
Как заметитьВ шаблоне встречаются имена машин и служебные адреса.
Как правильноОставить в теле только то, что объясняет неудачу: ответ приёмника, получателя и время.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
dsn-failed-body-template-from <path>
Значения
путь к файлу шаблона
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
Global
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Директива пишется в корне файла конфигурации и действует на весь узел: блока для неё нет, и наследования тоже. Разных отчётов для разных отправителей или получателей задать нельзя — шаблон один.
Как проверить на узле
Строку видно в конфигурации, но проверять надо письмом:
grep -n 'dsn-failed\|custom-dsn-from-header\|suppress-local-dsn' /etc/pmta/config
ls -l /etc/pmta/dsn-body-template.txt
Если подавление отчётов включено, шаблон не проявится никак. Если нет — отправить письмо на заведомо несуществующий адрес и посмотреть, что пришло: неверная подстановка останется в тексте как есть, без всякой ошибки.
В Хабе
Цена ошибки
безопасно: неверное значение ничего не ломает
Сценарии
Приём входящей почты