dkim-headers

<domain>

Какие заголовки письма попадают под подпись
в конфигурации это строкаdkim-headersвнутри блока <domain>
Что защищено подписью, а что можно менять безнаказанно

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

Обязательный набор изменить нельзя. Руководство перечисляет около тридцати заголовков, которые подписываются всегда, если есть в письме: From, Sender, Subject, To, Cc, Date, Message-ID, Reply-To, MIME-Version, вся семья Content-*, вся семья List-*, вся семья Resent-*. Эта строка добавляет к набору, а не заменяет его.

Семь заголовков подписывать запрещено почтовым стандартом: Bcc, Received, Return-Path, DKIM-Signature, Keywords, Comments, Resent-Bcc. Они меняются в пути по устройству протокола, и подпись по ним ломалась бы всегда.

Главная ловушка — подписывают заголовок, которого в письме может не быть. Подпись перечисляет имена в поле h=, и если заголовок назван, а в письме отсутствует, приёмник считает, что его удалили в пути, — и проверка не проходит. Добавлять в список стоит только те заголовки, которые в вашей рассылке есть всегда.
Что делает Хаб. Не пишет — обязательного набора хватает. Он и так покрывает всё, чем подменяют письмо: отправителя, тему, получателя, тип содержимого и семью отписки. Добавлять есть смысл только собственные служебные заголовки, если они у вас появятся.
Рекомендуемые значения

Добавляйте только постоянные заголовки. Названный, но отсутствующий заголовок ломает проверку — он читается как удалённый.

Выражение в косых чертах ловит семью сразу. Так подписывают собственные заголовки с общей приставкой, не перечисляя каждый.

Пустая строка — не «ничего не подписывать». Она означает «оставить набор по умолчанию»; отменить обязательные заголовки нельзя вовсе.

Правило «только постоянные заголовки» — наше. Из руководства здесь обязательный набор целиком, семь запрещённых стандартом, синтаксис имён и выражений и смысл пустой строки.
Пример в конфигурации
# к обязательному набору добавляем свои служебные
<domain *>
    dkim-headers X-Campaign-Id, /^X-Kendali-/</domain>
Первое значение — точное имя, второе — выражение: оно покроет все собственные заголовки с этой приставкой без перечисления.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Подписывают заголовок, который есть не в каждом письме

наш опыт

Чем чреватоПриёмник видит его имя в поле h=, не находит в письме и считает удалённым в пути. Проверка не проходит — у части писем, и понять, у какой именно, по конфигурации нельзя.
Как заметитьПровалы проверки подписи у части рассылки при верном ключе.
Как правильноОставить в списке только заголовки, которые есть всегда.

Пытаются сузить набор

§ 3.3.10.26

Чем чреватоОбязательные заголовки подписываются независимо от значения, а пустая строка означает «оставить как есть». Сузить набор строкой нельзя ни при каком значении.
Как заметитьЗначение задано, поле h= в подписи прежней длины.
Как правильноНичего: это устройство MTA. Строка только добавляет.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
dkim-headers <header-list>
Значения
имена заголовков через запятую и (или) выражения в косых чертах; пустая строка означает «оставить набор по умолчанию»
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<domain>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Значение сливается по блокам <domain> от общего к частному: побеждает наиболее подходящий блок, а не последний по файлу. Обязательный набор подписывается независимо от значения — строка к нему добавляет. Подхватывается по pmta reload; на письма в очереди действует со следующей попытки: подпись ставится при отправке.
Как проверить на узле
Действующее значение печатает команда настроек очереди; что подписано на самом деле — перечислено в поле h= самой подписи:
pmta show settings gmail.com/vmta1 | grep -i dkim-headers
grep -i 'DKIM-Signature' /var/log/pmta/pmta.log | tail -3
В заголовке подписи имена подписанных заголовков стоят в поле h= через двоеточие — это и есть окончательный ответ. Хаб этой строки не пишет.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Подпись и аутентификация писем