map-header-to-field

<acct-file>

Подстановка заголовка письма в стандартное поле учёта
в конфигурации это строкаmap-header-to-field noneвнутри блока <acct-file>
Когда своё значение нужно в чужой колонке

Строка берёт содержимое заголовка письма и кладёт его в стандартное поле записи учёта — для одного вида записей. По умолчанию не настроена.

Отличие от record-fields принципиальное. Там заголовок добавляется новой колонкой (header_ИМЯ), и разбирающая программа должна о ней знать. Здесь он подменяет существующую колонку — и программа, которая её уже читает, получит ваше значение без единой правки.

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

Один заголовок можно разложить в несколько полей, и он попадёт в каждое.

С видом tq строка не работает — руководство оговаривает это отдельно.

Главная ловушка — подменить поле, на которое опирается чужой разбор. Поле сохраняет имя и меняет смысл: в колонке получателя оказывается не адрес, а ваш идентификатор. Ошибка тихая — данные выглядят правдоподобно и означают другое.
Что делает Хаб. Не пишет: связку со своей стороной мы делаем честнее — отдельной колонкой через record-fields (*,header_ИМЯ), и приёмник знает, что это заголовок.

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

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

Порядок строк — часть настройки:

Запись Что делает
d header_x-uid rcpt в поле получателя у доставок кладётся заголовок
вторая строка на то же поле берётся, если первого заголовка в письме нет
d header_x-uid orig тот же заголовок ещё и во второе поле

Вид tq не поддерживается.

Синтаксис, значимость порядка, откат к исходному значению, запрет для tq и возможность разложить один заголовок в несколько полей — из руководства (§ 3.3.11.10). Сравнение с record-fields — наше.
Пример в конфигурации
# чужой сборщик читает колонку rcpt и переписать его нельзя
<acct-file /var/log/pmta/acct.csv>
    records d, b
    map-header-to-field d header_x-uid rcpt    map-header-to-field d header_x-legacy-uid rcpt
</acct-file>
Вторая строка — запасная: она сработает, только если первого заголовка в письме нет. Не нашлось ни одного — колонка сохранит настоящий адрес получателя.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Подменяют поле, не предупредив разбирающую сторону

наш опыт

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

Ждут подстановки в записи вида tq

§ 3.3.11.10

Чем чреватоЭтот вид строкой не поддерживается. Настройка молча не применится к нему, и поле останется исходным.
Как заметитьПодстановка работает у доставок и не работает у очередных ошибок.
Как правильноДля tq пользоваться отдельной колонкой в record-fields.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
map-header-to-field <mapping>
Значения
вид записи, затем header_ИМЯ, затем имя поля учёта
Умолчание
none § 3.3.11.10
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<acct-file>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Наследования нет: строка живёт внутри своего <acct-file> и относится к одному виду записей в нём. Соседний блок учёта может писать то же событие с неподменёнными полями — так и стоит делать, если подмена нужна только одному потребителю.
Как проверить на узле
Проверять надо содержимое колонки, а не наличие строки:
head -3 "$(ls -t /var/log/pmta/acct-*.csv | head -1)"
В подменённой колонке должно оказаться значение заголовка. Если там прежнее значение, значит заголовка в письме не было ни одного из перечисленных — это и есть штатный откат.
В Хабе
Цена ошибки
опасно: последствия переживут откат
Сценарии
Собрать телеметрию