smtp-hosts

<domain>

Явные серверы доставки вместо обычного поиска по DNS
в конфигурации это строкаsmtp-hostsвнутри блока <domain>
Куда стучаться, если не туда, куда указывает DNS

Обычно узел спрашивает у DNS записи MX домена получателя и идёт по ним. Эта строка заменяет или изменяет такой поиск: вы называете серверы сами — именами, адресами или указанием взять записи MX другого домена.

Список устроен как настоящие записи MX. Запятая разделяет хосты внутри одного уровня предпочтения — по ним узел ходит по кругу; точка с запятой начинает следующий уровень, к которому переходят, только если первый не отвечает. Адрес пишется в скобках — [10.1.1.1] или [IPv6:2001::1], — а после двоеточия можно указать порт.

Отдельный вид — lookup-mx:. Он не отменяет DNS, а перенаправляет вопрос: «возьми записи MX вот этого домена». Именно так живут сведённые очереди, чьё имя не существует в DNS: queue-to и сведение по подстановочному знаку без него не работают вовсе.

Главная ловушка — тихо отключается всё, что зависит от поиска MX. Запроса MX больше нет, а значит bounce-upon-no-mx не срабатывает ни при каких значениях: отсутствие записи проверять не на чем. Точно так же перестают действовать все решения, привязанные к перебору записей MX. Строка выглядит как «уточнение маршрута», а на деле убирает целый слой проверок.
Что делает Хаб. Не пишет. Маршрут до приёмника Хаб оставляет системе доменных имён: список серверов, вбитый руками, устаревает молча — приёмник поменял шлюзы, а конфигурация продолжает стучаться в старые. Строка понадобится, когда Хаб научится сводить очереди: там без неё нельзя.
Рекомендуемые значения

lookup-mx: предпочтительнее списка. Он не устаревает: приёмник поменял шлюзы — узел узнает об этом из DNS. Явный список этого не умеет.

Уровни предпочтения — не украшение. Всё, что перечислено через запятую, узел использует по кругу; на следующий уровень он переходит, только когда предыдущий недоступен. Список из одного уровня — это балансировка, из двух — резерв.

Порт задавайте здесь, а не отдельно. Порт, указанный после двоеточия, перекрывает default-smtp-port для этого получателя.

Совет предпочитать перенаправление запроса MX на чужой домен — наш. Из руководства здесь синтаксис уровней, запись адреса в скобках, указание порта, форма lookup-mx: и очистка пустой строкой.
Пример в конфигурации
# сведённой очереди своего домена в DNS нет — берём чужие MX
<domain hotmail.queue>
    smtp-hosts lookup-mx:hotmail.com</domain>

# два по кругу, потом резервный адрес с нестандартным портом,
# потом последний рубеж
<domain email.test.com>
    smtp-hosts h1.test.com, h2.test.com; [10.1.1.1]:2525; last.test.com</domain>
Во втором блоке три уровня предпочтения: h1 и h2 работают по кругу, к адресу переходят только при их недоступности, к last.test.com — при недоступности первых двух уровней.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Вбивают список адресов вместо lookup-mx:

наш опыт

Чем чреватоПриёмник переезжает, меняет шлюзы, выводит адреса из работы — а конфигурация продолжает стучаться в прежние. DNS об этом знает, но его больше не спрашивают.
Как заметитьСоединения к получателю перестали устанавливаться, при этом dig MX отдаёт другие имена, чем стоят в конфигурации.
Как правильноЗаменить список на lookup-mx: с именем настоящего домена, оставив явные адреса только там, где DNS действительно не отвечает нужным.

Задают список и рассчитывают на отказ по отсутствию MX

§ 3.3.10.69

Чем чреватоЗапроса MX не происходит, и bounce-upon-no-mx молчит при любом значении. Защиту считают включённой, а её нет.
Как заметитьСтрока отказа по отсутствию MX задана, но не срабатывает ни разу.
Как правильноУбрать одну из двух строк: они про взаимоисключающие способы добраться до приёмника.

Перечисляют резервные серверы через запятую

наш опыт

Чем чреватоЗапятая — это один уровень предпочтения: узел ходит по всем перечисленным по кругу. Резервный сервер, задуманный как резервный, получает свою долю обычного потока.
Как заметитьРезервный узел приёмника получает письма постоянно, а не только при сбое основного.
Как правильноРазделять уровни точкой с запятой, а не запятой.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
smtp-hosts <host-list>
Значения
список хостов или адресов; запятая — хосты одного уровня предпочтения, точка с запятой — следующий уровень; адрес в квадратных скобках, порт после двоеточия; либо lookup-mx: и имя домена; пустая строка снимает унаследованное значение
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<domain>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Значение сливается по блокам <domain> от общего к частному: побеждает наиболее подходящий блок, а не последний по файлу. Пустая строка (“”) снимает унаследованное значение — так возвращают домену обычный поиск по DNS, если список задан блоком со звёздочкой. Подхватывается по pmta reload; на открытые соединения не влияет.
Как проверить на узле
Действующий список печатает команда настроек очереди; куда письма ушли на самом деле — видно по адресу приёмника в учёте:
pmta show settings hotmail.queue/vmta1 | grep -i smtp-hosts
dig +short MX hotmail.com | sort -n
Вторая команда показывает, что отдал бы DNS: расхождение с явным списком и есть цена ручного маршрута. Хаб маршруты не задаёт и это расхождение не отслеживает.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Жизненный цикл конфигурации