include-headers-from

Global

Файл заголовков, вставляемых в каждое письмо
в конфигурации это строкаinclude-headers-fromвнутри блока Global
То же имя ещё 2:Global<virtual-mta><virtual-mta-pool>— часть из них другие настройки, часть та же самая
Одинаковые заголовки во всех письмах — файлом

Строка называет файл; его содержимое — заголовки в обычном почтовом формате — вставляется в каждое письмо, уходящее через адрес отправки. Место вставки оговорено: сразу после Received, который добавляет сам узел.

Наследование здесь не такое, как у остальных директив. Руководство говорит прямо: заданная на уровне узла строка достаётся всем адресам отправки, и если у адреса отправки уже есть своя — применяются обе. Это единственная директива блока, где значения складываются, а не перекрывают друг друга.

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

Главная ловушка — сложение, принятое за перекрытие. Написав файл на уровне узла и «свой» у адреса отправки, вы получите оба набора заголовков в письме, а не второй вместо первого. Дубли заголовков, которые обязаны быть в единственном числе, — это уже вопрос к доставляемости.
Что делает Хаб. Не пишет: заголовки писем формирует отправляющая сторона, а узел, наоборот, снимает лишнее — remove-header вычищает служебные заголовки платформы, а add-received-header выключен. Файл заголовков пригодился бы для чего-то, что обязано быть в каждом письме независимо от отправителя, — например, ссылки на политику; таких требований у нас пока нет.
Рекомендуемые значения

Значение — путь к файлу. Что учитывать при его наполнении:

Что кладут Стоит ли Почему
List-Unsubscribe нет, лучше ставить отправителем адрес отписки зависит от получателя, а файл один на всех
ссылка на политику или контакт да одинакова для всех писем
внутренние идентификаторы нет получатель их увидит
что-то, что уже ставит платформа нет получатся дубли: значения складываются

Проверять на дубли обязательно: складывающееся наследование — главный источник повторяющихся заголовков.

Место вставки и правило сложения — из руководства (§ 3.3.1.55.3). Что класть в файл — наше.
Пример в конфигурации
# общий для узла файл заголовков
include-headers-from /etc/pmta/common-headers.txt
# у этого адреса отправки есть свой — применятся ОБА файла
<virtual-mta shop-example-com>
    include-headers-from /etc/pmta/shop-headers.txt
</virtual-mta>
Именно так и написано в руководстве: обе строки действуют. Письмо через shop-example-com получит заголовки из обоих файлов, и если в них есть одинаковые имена — они окажутся в письме дважды.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Ждут, что файл адреса отправки заменит общий

§ 3.3.1.55.3

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

Кладут в файл адрес отписки

наш опыт

Чем чреватоФайл один на все письма, а ссылка отписки обязана быть персональной. Общий List-Unsubscribe либо не работает, либо отписывает не того.
Как заметитьОтписки не доходят до отправителя или приходят без указания, кто отписался.
Как правильноСтавить такие заголовки на стороне отправителя, где известен получатель. Файл — для того, что действительно одинаково у всех.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
include-headers-from FILENAME
Значения
путь к файлу с заголовками в формате RFC 2822
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
Global, <virtual-mta>, <virtual-mta-pool>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
🔴 Исключение из общего правила. У остальных директив значение из более частного блока перекрывает общее; здесь они складываются: руководство прямо пишет, что при заданной строке у адреса отправки применяются обе. Про уровень <virtual-mta-pool> руководство не говорит ничего — правило сложения сформулировано только для узла и адреса отправки.
Как проверить на узле
Проверять надо по доставленному письму: отправить на свой ящик и посмотреть исходный код. Где строка задана:
grep -rn 'include-headers-from' /etc/pmta/
В письме заголовки должны стоять сразу после Received. Если каждый встречается дважды — сработало сложение: файл задан и на узле, и у адреса отправки.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Разделение отправителей