Договор о телеметриикритичноМеханизмОдин блок описывает выход учёта целиком: какие виды записей, какие поля, куда они идут, как сменяются файлы и что обезличивается.Как складывается политика для приёмникакритичноМеханизмНастройки собираются от самого общего образца к самому точному; порядок блоков в файле не значит ничего.Именованный прокси и три уровня его настроеккритичноМеханизмБлок несёт адрес прокси, внешний адрес отправки, версию протокола, тип поля и число попыток; первые две строки обязательны.Как узел отвечает на слова приёмникакритичноМеханизмСопоставляет ответы SMTP с регулярными выражениями и по совпадению меняет режим очереди — тот самый спусковой крючок, которого ждёт вся машинерия щадящего режима.Как узел выбирает источник и складывает его настройкикритичноМеханизмСоединение попадает под все блоки источника, чьи адреса его накрывают, и действуют они слитно — узкий перекрывает широкий; именованные блоки подключаются только по прямой ссылке.Адрес отправки — из чего он складываетсякритичноМеханизмИменованный набор всего, что является свойством адреса: с какого IP уходит письмо, чем узел представляется, чем подписывает и как быстро шлёт.Файл, программа или эндпоинт — и файл под каждым из трёхкритичноМеханизмТри способа отдать записи учёта; у эндпоинта под низом всё равно файл, который удаляется только после успешной отправки, а ответ не 2xx вызывает повтор.Как устроена запись учётакритичноМеханизмКак устроена запись учёта: вид записи в первом столбце, дальше поля, состав которых настраивается.Две точки подключения — и два разных поведениякритичноМеханизмСписок, подключённый к источнику, отвергает получателя при подаче или отбивает письмо позже; подключённый к адресу отправки или пулу — всегда принимает и отбивает.Как узел решает, впустить ли запрос по HTTPкритичноМеханизмДва способа представиться — уровень доступа по адресу и ключ; ключ сильнее и работает с любого адреса.Щадящий режим — вторая личность очередикритичноМеханизмОчередь, которой приёмник начал отказывать, переключается на параллельный набор лимитов, повторов и маршрутов — десять директив, действующих только в этом режиме.Категория отказа в учёте — настраиваемая, а не вендорскаякритичноМеханизмСтрока bounceCat в каждой записи учёта берётся из списка образцов, который можно дополнить своими правилами и своими названиями категорий.Разбор отказов, пришедших письмомкритичноМеханизмОтчёты об отказах, приходящие письмом, разбираются отдельным обработчиком — и он работает раньше обработчика жалоб.Настройка через API и файл не сходятсякритичноМеханизмОбъекты, созданные через интерфейс настройки, в файле не правятся: два источника правды о конфигурации не сходятся.Как узел подписывает письма и выбирает ключкритичноМеханизмКлюч выбирается по домену отправки из заголовков, перебором объявлений сверху вниз.Как назвать очередь в командекритичноМеханизмКак назвать очередь в аргументе команды: та же пара «приёмник и адрес отправки», к которой добавлены звёздочки.Жалобы, разобранные узлом — и разбираются они вторымикритичноМеханизмПочта, пришедшая на адрес из настроенного списка, разбирается как отчёт о жалобе; порядок разбора важен — обработчик жалоб работает после обработчика отказов.Заголовок заданиякритичноМеханизмЗаголовок x-job метит письмо заданием; узел читает его, только если источнику разрешено process-x-job, и тогда задание видно в учёте, мониторе и командах паузы.Две метки, которые отправитель вешает на письмокритичноМеханизмЗадание группирует письма, идентификатор конверта опознаёт одно; обе ставит подающая сторона, и только по ним потом можно отобрать свою почту в очереди узла.Что узел рассказывает о себе и по каким каналамкритичноМеханизмСемь поверхностей наблюдения: веб-монитор, консоль в четырёх форматах, журнал, учёт, поиск по учёту, метрики и выгрузка во внешнюю аналитику.Разные домены в одну очередь, потому что шлюз одинкритичноМеханизмДомены, чьи младшие MX совпали со списком, объединяются в одну очередь и лимитируются как один получатель.Внешние адреса на одной машине, узлы внутрикритичноМеханизмУзлы стоят на внутренних адресах и выходят наружу через прокси, на котором собраны все внешние адреса отправки.Не отправлять то, что не пройдёт проверку у получателякритичноМеханизмУзел сам проверяет SPF своей почты перед отправкой: не прошло — отбивает, не дожидаясь чужого отказа.Очередь — это приёмник вместе с адресом отправкикритичноМеханизмMTA группирует письма по паре «домен получателя плюс адрес отправки»: один домен с двух адресов — это две независимые очереди со своими счётчиками, соединениями и режимом.Четыре способа сказать «медленнее»критичноМеханизмПисьма, объём данных, темп подключений и число соединений — у каждого свой лимит, и у каждого есть вариант «на адрес источника» и двойник для щадящего режима.События получателейкритичноМеханизмПоследние 50 событий доставки, отказа и задержки по очереди — включаются track-recipient-events и видны в выводе очередей.Кому разрешено сдавать почту и для кого её приниматькритичноМеханизмИз коробки узел принимает подачу только с самой машины; два разных вопроса — «кто может слать через нас» и «на чьи адреса мы принимаем» — решаются разными директивами.Перезагрузка настроек против перезапуска службыкритичноМеханизмКонфигурация читается при старте, дальше правки подхватываются командой перезагрузки — кроме тех директив, которые руководство помечает как требующие перезапуска.Занятые имена переменных слияниякритичноМеханизмЧасть имён переменных слияния занята MTA: свои переменные так называть нельзя.Наблюдение за репутацией внутри узлакритичноМеханизмMTA сам следит за ответами приёмников и по совпадению с образцом меняет режим очереди — реакция внутри соединения, а не по телеметрии.Четыре типа значений, на которых написан весь конфигкритичноМеханизмЛогическое, образец домена, регулярное выражение и промежуток времени — определены один раз в § 3.2 и дальше используются всеми директивами.Имя, адрес и имя в приветствии — из чего состоит адрес отправкикритичноМеханизмОпределение маленькое, и два его свойства легко упустить — пропуск строки адреса молча наследует настройки узла, а несколько адресов в одном блоке перебираются по кругу.Отправитель называет поток для каждого письмакритичноМеханизмПисьмо несёт имя потока, которым его надо отправить, — выбор делает подающая программа, а не конфигурация узла.Шесть способов выбрать поток и порядок между нимикритичноМеханизмПоток письма задают переменная слияния, вызов API, заголовок, правило по образцу, слушатель и умолчание источника — руководство перечисляет их по старшинству.Заголовки, которыми отправитель управляет доставкойкритичноМеханизмШесть служебных заголовков позволяют подающей стороне выбрать поток, пометить письмо заданием, задать настройки и ключ подписи, идентификатор конверта и расписание; каждый разрешается отдельно и по источникам.Поток назван заголовком, если источнику это разрешенокритичноМеханизмЗаголовок письма называет поток; источник, с которого письмо подано, должен иметь разрешение на обработку заголовка, и перед доставкой заголовок снимается.Списки адресов — именованные и безымянныеМеханизмСписок адресов, доменов, образцов или хешей; именованный подключается директивами вроде подавления, безымянный живёт внутри процессора входящей почты.Группа адресов отправки с долями трафикаМеханизмИменованная группа адресов отправки; без долей письма раздаются по кругу, с долями — в заданной пропорции, с шагом в десятую процента.Что нужно обвязке подачиМеханизмЧто должно быть на стороне подающего, чтобы обвязка заработала: библиотека, права и членство в группе.Засеивание кампаний контрольными адресамиМеханизмMTA подмешивает в рассылку адреса вендора, а результат смотрят в его инструменте доставляемости; независимо от выгрузки событий.Получатели, отложенные после временного отказаМеханизмПолучатель, которому приёмник ответил 4xx, переезжает в отдельную область ожидания с интервалом по приёмнику; две команды умеют выпустить его раньше срока.Два обработчика входящих отчётов и что с ними делатьМеханизмОтказы письмом и жалобы разбираются двумя одинаково устроенными блоками; у каждого свой список адресов и своя пара решений о судьбе письма.Прогрев, встроенный в MTAМеханизмПрогретый адрес отдаёт первые N писем дня каждому получателю своему холодному напарнику; тот отправляет их сам и набирает историю.Что подающая система собирает перед отправкойМеханизмВсе пять языковых обвязок дают три одинаковых предмета — соединение с узлом, письмо и его получателей, — собираемых в неизменном порядке.Своя лестница повторовМеханизмretry-after и backoff-retry-after принимают список интервалов — до 30 ступеней, последняя действует до отказа.Приёмник объявляет требование шифрования в своей зоне DNSМеханизмУзел смотрит записи DANE получателя и, если тот требует STARTTLS, отправляет только по зашифрованному каналу с проверенным по отпечатку сертификатом.Умолчание источника — нижняя ступень, привязанная к тому, кто подключаетсяМеханизмБлок источника, совпавший с адресом отправителя, может назвать поток по умолчанию; он применяется, когда выше по лестнице выбор не сделан.Одноимённые директивыМеханизмИмя директивы определяет настройку только вместе с блоком: 48 из 417 имён описаны больше чем в одном месте, и одно имя в разных блоках — не всегда одна настройка.Как перевести план отправки в железоМеханизмДве постоянные, по которым считается любой узел: около 2 КБ памяти на каждого получателя в очереди и место под спул, пропорциональное суммарному размеру писем.Узел умеет сам вставлять пиксели и переписывать ссылкиМеханизмВ режиме отслеживания вендора MTA разбирает исходящий HTML, переписывает ссылки на домен отслеживания и вставляет пиксели открытия — с выбором того, что делать, если разметка не разбирается.Форматы ответа монитораМеханизмВеб-монитор отдаёт страницы человеку по адресу с /ui, а программе — XML или JSON по тому же адресу без суффикса.Ограничения облакаМеханизмОблака ограничивают исходящую почту через порт 25, пока не попросишь снять лимит, а их диапазоны адресов почтовики встречают с подозрением.Разбор и правка разметкиМеханизмОтслеживание открытий и переходов в режиме sparkpost правит разметку письма с помощью встроенного разборщика gumbo-parser; письмо, разметку которого разобрать не удалось, по умолчанию отбивается.Учёт, отправляемый узлом, вместо учёта, забираемого с узлаМеханизмЗаписи учёта можно отправлять на эндпоинты HTTP в дополнение к файлам и каналу — не вместо них.Как API сообщает об ошибкеМеханизмПодача по HTTP сообщает об ошибках кодами ответа, а API настройки на всё, кроме отказа в доступе, отвечает 200 и пишет исход в поле status.Отдать письмо вебхуку вместо приёмникаМеханизмОчередь шлёт письмо запросом POST в виде объекта JSON; успехом считается только ответ 2xx.Что делать с принятым письмомМеханизмЧто узел делает с принятым входящим письмом: пересылает, кладёт в файл, гасит, передаёт программе или разбирает как отказ или жалобу.Логины подачи, пароли открытым текстом и настройки на каждогоМеханизмОтправитель входит одним из трёх способов; каждый логин — блок конфигурации с паролем в открытом виде, и именованный источник этого логина перекрывает то, что дал бы его адрес.Ключ активации — условие установки, а не шаг после неёМеханизмБез ключа активации от поддержки SparkPost MTA не ставится и не работает, а уровень лицензии задаёт потолок исходящих соединений: на стандартной всё сверх 200 игнорируется.Персонализация внутри MTAМеханизмПеременные задаются по каждому получателю, а подставляет их узел при доставке — одно поданное письмо уходит многим с разным содержимым.Отдача показателей сборщикуМеханизмОтдача показателей узла внешнему сборщику в его формате.Приёмник объявляет требование шифрования на своём сайтеМеханизмУзел забирает политику получателя по HTTPS и, если та в режиме принуждения, доставляет только при совпадении MX, шифровании и проверенном сертификате.Формат жалоб одного крупного приёмникаМеханизмЖалобы Hotmail приходят не в стандартном ARF: чтобы MTA их опознал и записал получателя, нужен вариант с вложением RFC и заголовок X-HmXmrOriginalRecipient.Форматы вывода командМеханизмКоманды узла умеют печатать не только текст, но и структуру.Поток выбирается сопоставлением конверта или заголовкаМеханизмИменованный список правил сверяет обратный адрес, получателя или заголовок с регулярными выражениями и назначает поток по первому совпадению.Сторож, который перезапускает MTAМеханизмПрисматривает за MTA и после падения поднимает его сам, отправляя отчёт о падении на адрес ответственного.Метрики узла в стандартном форматеМеханизмУзел отдаёт счётчики, датчики и сводки в общепринятом формате: трафик, соединения, ошибки, глубина очереди и задержки.CSV или JSON — выбирает расширение файла, а не директиваМеханизмЗаписи пишутся как значения через запятую с заголовочной строкой или как объекты JSON по одному на строку; выбор делает расширение в пути.Узлу нужен резолвер, который делает всю работу самМеханизмMTA требует рекурсивного разрешения имён; резолвер, отвечающий отсылкой к другому серверу, вынуждает повторять запрос и предупреждает записью в журнал.Диалект регулярных выраженийМеханизмРегулярные выражения конфигурации — совместимые с Perl, на библиотеке PCRE: так пишут выбор адреса отправки, правила ответов, категории отказов, списки адресов и заголовки подписи.Подача — сетевая служба, и в неё можно войтиМеханизмПодающее приложение соединяется с узлом по имени или адресу и порту — либо без входа, либо с именем и паролем, которые узел настроен принимать.Чем опасна виртуальная машинаМеханизмРаботать на виртуальной машине можно, но руководство не рекомендует это без достаточного железа и выверенных настроек гипервизора: под нагрузкой узел может перестать отвечать.Окна отправки, заданные в самом письмеМеханизмЗаголовок несёт один или несколько промежутков, в которые письмо разрешено отправлять; расписание отменяет срок жизни письма, и письмо отбивается, когда окна кончились.Вторая подпись на том же письмеМеханизмДвенадцать строк с приставкой second-: письмо подписывается дважды, разными ключами и от разных имён.Узел берёт тот поток, чей адрес совпал с адресом подключенияМеханизмУмолчание источника принимает зарезервированное значение вместо имени потока — тогда узел выбирает тот поток, чей адрес отправки совпадает с адресом, на который пришло подключение.Аналитика вендора — и что уходит с узла ради неёМеханизмПлатная служба, принимающая данные учёта узла и возвращающая аналитику, оценку здоровья и отчёт по спам-ловушкам; включается по областям и выключена, пока нет её блока.Три правила пула, названные руководством прямоМеханизмРаздача по кругу, наследование настроек участниками с перекрытием у самого участника и общее с адресами отправки пространство имён.Переменная слияния — верхняя ступень, и живёт она в содержимомМеханизмСлужебная переменная слияния называет поток для письма и перебивает все остальные способы выбора на своём пути подачи.Лицензия на парк, а не на серверМеханизмЛицензия не привязана к серверу: её ставят на столько машин, сколько разрешает предел экземпляров, а узлы раз в час отправляют вендору статистику объёма.Что защищает веб-монитор и чем эта защита не являетсяМеханизмТри разные защиты — список адресов, шифрование и совет не выставлять монитор в интернет; учётных записей нет ни одной.Выбор адреса отправки по содержимому письмаМеханизмРегулярные выражения сопоставляются с заголовком, обратным адресом или получателем и выбирают адрес отправки либо назначают приоритет; списки умеют вызывать друг друга.Как обвязка сообщает об ошибкеМеханизмОбвязка C++ сообщает об ошибке исключением, после которого объект выбрасывают; обвязка C — возвратом признака и отдельным запросом последней ошибки.Библиотека шифрования — часть поставки, а не системыМеханизмOpenSSL приезжает внутри дистрибутива PowerMTA, поэтому набор версий и шифров определяется версией продукта, а не системными библиотеками.Указатель директивМеханизмАлфавитный перечень руководства: 475 строк называют 477 мест описания директив — единственная полная опись языка конфигурации.Второй формат отчёта о жалобеМеханизмЖалобы в формате XARF — JSON вместо ARF: основные поля MTA заполняет сам, а прочие достают путём xarf.<путь>.Что нельзя в режиме FIPSМеханизмВ режиме FIPS доступен только проверенный набор алгоритмов: часть привычных настроек шифрования и подписи становится недоступной.Формат подачи по HTTPМеханизмВместо готового письма запрос по HTTP может нести отправителя, тему, заголовки, текст, HTML, AMP и вложения отдельными полями — узел сам соберёт и закодирует письмо.Требование к переводам строкМеханизмСтроки подаваемого письма заканчиваются парой CRLF; одиночный LF — самая частая ошибка самописной подающей программы, и разбирают её записью сессии.Журнал и учёт — два файла и два разных вопросаМеханизмMTA ведёт отдельный журнал и отдельный файл учёта; разделение сделано ради формата, производительности и возможности отдать журнал не раскрывая данные.Слияние через расширения SMTPМеханизмСлияние по SMTP: XMRG вместо MAIL FROM, XDFN с переменными перед каждым получателем и XPRT вместо DATA для каждой части.Нумерованные части слиянияМеханизмНумерованные куски письма для многочастных слияний: первый подразумевается, каждый номер используется один раз.Отчёты, которые MTA не понимает самМеханизмПриёмники, отдающие отказы и жалобы в нестандартном виде, разбираются своими образцами; извлечённые поля ложатся в учёт наравне с обычными.Авторизация при доставкеМеханизмУзел входит на стороне приёмника логином и паролем из блока <domain> — CRAM-MD5, LOGIN или PLAIN, если приёмник их поддерживает.На какие исходы приходит отчёт — решает каждый получательМеханизмДля каждого получателя отдельно запрашивается отчёт об успехе, о неудаче, о задержке, о любом их сочетании или ни о чём; умолчание — только неудача.Подача письма записью файла в каталогМеханизмПисьмо кладётся файлом в каталог, а конверт передаётся особыми заголовками в его начале; MTA забирает файл в спул и доставляет.Держать выбранные домены разрешёнными постоянноМеханизмФайл со списком доменов, чьи записи DNS обновляются по своему расписанию независимо от очереди и вопреки их собственному сроку жизни.Два приоритета, и какой из них выигрываетМеханизмПриоритет очереди решает, каким получателям соединения достанутся раньше; приоритет получателя переставляет письма внутри одной очереди и очередь обогнать не может.Пять способов очереди отдать письмоМеханизмОчередь не обязана ходить по SMTP: она умеет писать в файл, запускать программу, стучаться по HTTP или выбрасывать.Свести домены в одну очередь вручную, назвав еёМеханизмТо же сведение, но по вашему списку, а не по совпадению MX: имя очереди задаёте вы.Разослать застрявшую очередь по нескольким адресамМеханизмПереброс не на один адрес, а в пул: письма расходятся по его участникам поровну.Что возвращать в отчёте об отказеМеханизмЧто вкладывать в отчёт об отказе: письмо целиком или только его заголовки.Поток следует за адресом, на который вы подключилисьМеханизмИменованный блок источника подключается к слушателю и действует на всех, кто соединился с этим адресом и портом, — значит, отправитель выбирает поток выбором точки подключения.Кодировки при подачеМеханизмДанные письма в обвязке добавляются как 7-бит, 8-бит или base64: первые два не меняют данных, кроме перевода одиночного LF в CRLF, base64 кодирует на лету; данные слияния — только 7-бит и 8-бит.Как письмо попадает в MTAМеханизмШесть описанных способов подачи: расширенный SMTP, четыре языковые обвязки и каталог, за которым узел следит на диске.Кто занял портМеханизмДва слушателя на один порт не помещаются: если порт уже занят, узел не поднимется, и причина будет только в журнале.Чужие составляющие MTAМеханизмPowerMTA работает на пяти сторонних библиотеках — PCRE, OpenSSL, ICU, gumbo-parser и prometheus-cpp; их поведение задаёт сборка MTA.Подача по HTTPS на своём приёмнике, по образцу SparkPostМеханизмОтдельный вход: свой приёмник с сертификатом, свои ключи и зарезервированное имя источника, через которое к такой почте применяются обычные настройки подачи.Заголовок балансировщика на входеМеханизмУзел читает заголовок PROXY в начале входящего соединения и считает источником адрес из него; работает у обоих видов входа.Секреты во внешнем хранилищеМеханизмКлючи подписи можно держать в HashiCorp Vault: в конфигурации остаётся путь, MTA берёт ключ по HTTP и держит в памяти, не записывая на диск.Обратный адрес, в который вписан получательМеханизмОтказ приходит на уникальный адрес, и разбирать его содержимое не нужно.Ключ подписи, пришедший вместе с письмомМеханизмПриватный ключ передаётся заголовком письма; узел подписывает им и удаляет заголовок перед отправкой.Заголовок письма, которым подающая сторона правит подписьМеханизмПять параметров в X-DKIM-Options: селектор, домен, имя подписи, способ запроса и список ключей.Замена получателя одним или несколькими другимиМеханизмПисьмо, пришедшее на объявленный адрес, пересылается на другие; раскрытие происходит после выбора потока, но до постановки письма в него.Подпись, которая сохраняет чужую проверку при пересылкеМеханизмТри заголовка, в которых пересыльщик заверяет: письмо пришло ко мне вот таким и вот с какими результатами проверок.Откат версии MTA и настройка через APIМеханизмПри откате PowerMTA на версию без API настройки заведённое через него становится невидимым, но не удаляется; таблица руководства говорит, что уцелеет при откате между версиями с API.Запуск в образеМеханизмЭкспериментальный запуск MTA в контейнере Linux: пакет, лицензия и конфигурация ставятся при сборке образа или подключаются при запуске.Поддельный приёмник внутри самого узлаМеханизмУзел слушает свой же порт и притворяется чужим сервером: письма уходят в никуда, а нагрузка настоящая.Отдать письмо программе на этом же узлеМеханизмОчередь запускает программу на каждого получателя и подаёт ей письмо на вход.Группа, дающая право управлятьМеханизмЧленство в группе pmta даёт непривилегированному пользователю право звать команды узла и пользоваться подачей.Отдача показателей по SNMPМеханизмУзел умеет отдавать свои показатели по SNMP — второй способ наблюдения помимо веб-монитора.Национальные алфавитыМеханизмФайлы конфигурации — в UTF-8, поэтому национальные домены и адреса пишут как есть; письмо с национальным адресом в конверте уйдёт, только если приёмник поддерживает SMTPUTF8.Обвязка подачи на .NETМеханизмОбвязка на .NET: руководство только называет папку с описанием — api\dotnet в каталоге установки на Windows — и требует .NET 2.0 или новее.Жизнь объекта в обвязке CМеханизмВ обвязке C каждый объект выделяют, инициализируют и освобождают явно — там, где в C++ это делают конструктор и деструктор.Указатель директив авторизацииМеханизмСводка директив, относящихся ко входу: они разбросаны по нескольким блокам.Обвязка подачи на CМеханизмОбвязка на C: те же операции функциями с приставками PmtaConn, PmtaMsg и PmtaRcpt, с явным выделением и освобождением объектов и запросом последней ошибки.Обвязка подачи на C++МеханизмОбвязка на C++: классы соединения, письма и получателя в трёх заголовочных файлах; ошибка бросает исключение и делает объект негодным.Заголовок датыМеханизмОбвязки подачи умеют сами собрать заголовок даты для письма, которое составляют с нуля.Как письмо уходит с узлаМеханизмНа уровне введения описаны два пути: расширенный SMTP к приёмнику или передача локальной программе; блок приёмника добавляет к ним ещё три.Обвязка подачи на JavaМеханизмОбвязка на Java: pmta.jar в classpath и файл провайдера для JavaMail; описание — в JavaDoc.Обвязка подачи на PerlМеханизмОбвязка на Perl: пакет CPAN Port25-Submitter из /opt/pmta/api, собирается и ставится обычным порядком; описание — в perldoc.Принять, направить, доставитьМеханизмПуть письма внутри узла: принять, решить куда, доставить — и между этими тремя шагами живут все настройки.