Отобрать поля, которые отвечают на вопросы

Учёт стоит места, и лишние столбцы платные

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

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

  • dlvTlsProtocol — была ли доставка на самом деле зашифрована; рядом стоит dlvTlsCipher;
  • numRetries — сколько неудачных попыток было до доставки; рядом стоят timeFirstAttempt и totalSecondsQueued;
  • dlvProxyName — через какой прокси ушла доставка;
  • bounceCat — категория отказа: у записей b она в наборе по умолчанию, у d — нет.

Области у составляющих разные. Поля выбираются на вид записи в каждом блоке <acct-file>, поэтому узел может писать подробный файл для одного потребителя и скупой для другого. Виды записей выбираются так же: по умолчанию только d и b.

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

Главная ловушка — считать звёздочку «всеми полями». Описание record-fields говорит «all», а таблицы полей — что звёздочка даёт только помеченные: dlvTlsProtocol, numRetries и dlvProxyName в неё не входят, и файл молча пишется без них.
Что делает Хаб. Применяет частично. К звёздочке у доставок и отказов Хаб добавляет timeFirstAttempt, totalSecondsQueued и numRetries. dlvTlsProtocol и dlvProxyName не названы: шифрование доставки в учёте не видно, а прокси узнаётся лишь по имени адреса отправки. bounceCat у отказов приходит со звёздочкой — он в наборе по умолчанию.
Рекомендуемые значения

Что назвать и что это даёт:

Поле В звёздочке На что отвечает
dlvTlsProtocol, dlvTlsCipher нет зашифрована ли доставка и чем
numRetries, timeFirstAttempt, totalSecondsQueued нет сколько неудач и времени до доставки
dlvProxyName нет через какой прокси ушло письмо
bounceCat у b да, у d нет категория отказа
Поля и отметки набора по умолчанию — из руководства (§ 12.2.1–12.2.2, § 3.3.11.12). Сама схема — наша гипотеза.
Пример в конфигурации
<acct-file /var/log/pmta/acct.csv>
    records d, b
    record-fields d *, timeFirstAttempt, numRetries, dlvTlsProtocol, dlvTlsCipher, dlvProxyName    record-fields b *, timeFirstAttempt, numRetries
</acct-file>
Звёздочка — поля по умолчанию, всё после неё добавляется к ним; bounceCat у b уже в звёздочке.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Как проверить на узле
Проверить, какие поля пишет файл учёта:
grep -n 'record-fields' /etc/pmta/config
head -1 "$(ls -t /var/log/pmta/acct-*.csv | head -1)"
Файл учёта в CSV начинается строкой заголовков: поля, которого там нет, в файле нет.