smtp-ip

Globalустарела

Адрес приёма почты — устаревшая половина пары
в конфигурации это строкаsmtp-ipвнутри блока Global
Половина настройки, которую заменили целой строкой

Строка задавала адрес, на котором узел слушает входящие почтовые соединения. Порт задавался отдельно — smtp-port, — и настройка всегда была разложена по двум строкам. Руководство отвело этому имени раздел из одной фразы: «устарела, используйте smtp-listener».

Замена соединяет адрес и порт в одну строку — smtp-listener CIDR:PORT. Разница не косметическая: пара «адрес плюс порт» могла описать только одну точку приёма, а строк замены в файле может быть сколько угодно, и 0.0.0.0 разрешено повторять, открывая несколько портов сразу. Плюс у замены есть необязательный параметр source=, которым слушателю назначают блок подачи с готовыми настройками.

🔴 Присутствие замены делает эту строку немой. Формулировка руководства прямая: если в конфигурации есть хоть одна строка smtp-listener, MTA игнорирует smtp-ip и smtp-port. Не ругается, не предупреждает — просто не смотрит на них.

А если нет ни одной строки замены, MTA неявно запускает слушателя на 0.0.0.0:25. То есть убрать все строки приёма и тем закрыть порт нельзя: закроется он только сменой порта, а не удалением.

Главная ловушка — смешанная конфигурация. Старая пара строк и одна новая строка в том же файле — самое частое состояние при недоделанном переводе. Работать будет только новая: адрес и порт из старой пары MTA не прочитает вовсе, и узел окажется слушающим не там, где написано в двух строках из трёх. Ошибка не даёт ни отказа при разборе, ни строки в журнале.
Что делает Хаб. Устаревшую пару не пишет. Пишет замену, и сразу двумя строками: smtp-listener 0/0:2525 для подачи кампаний и smtp-listener 0/0:25 для приёма жалоб и отказов на почтовом порту.

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

⚠️ Отдельная тонкость для тех, кто ищет по коду Хаба: имена smtp-ip и smtp-port в исходниках встречаются — но это настройки другого MTA, MailerQ, где они живые и означают своё. К PowerMTA они отношения не имеют.

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

Что ставить. Ничего: пару следует заменить одной строкой.

Значение Когда
не писать всегда: точка приёма задаётся заменой
адрес только в старой конфигурации, которую ещё не перевели

Перевод. Адрес из этой строки и порт из соседней складываются через двоеточие: smtp-ip 0.0.0.0 плюс smtp-port 25 дают smtp-listener 0/0:25. Обе старые строки после этого убираются — иначе в файле останутся настройки, на которые MTA не смотрит.

Пометка об устаревании и имя замены — из руководства, § 3.3.1.25. Правило «есть smtp-listener — эта пара игнорируется» и неявный слушатель 0.0.0.0:25 — из раздела замены § 3.3.1.27. Порядок перевода наш.
Пример в конфигурации
# так писали раньше — две строки на одну точку приёма
smtp-ip 0.0.0.0smtp-port 25

# так пишут сейчас — и точек приёма может быть несколько
smtp-listener 0/0:2525
smtp-listener 0/0:25
Пока в файле нет ни одной строки замены, действует пара сверху. Появилась хоть одна — MTA перестаёт смотреть на обе строки пары, ничего об этом не сообщая.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Переводят половину пары

§ 3.3.1.27

Чем чреватоДостаточно одной строки замены, чтобы MTA перестал читать обе старые. Узел слушает то, что написано в новой строке, а адрес и порт из старой пары не участвуют ни в чём — при этом остаются в файле и читаются как действующая настройка.
Как заметитьУзел принимает почту не на том адресе или порте, что записан в паре, хотя строки на месте.
Как правильноПереводить пару целиком и сразу убирать обе строки. Сверять результат по списку открытых портов, а не по файлу.

Убирают строки приёма, чтобы закрыть порт

§ 3.3.1.27

Чем чреватоНе осталось ни одной строки — MTA неявно запускает слушателя на 0.0.0.0:25. Порт, который собирались закрыть, оказывается открытым на всех адресах машины.
Как заметитьВ конфигурации ни одной строки приёма, а двадцать пятый порт слушается.
Как правильноЗакрывать приём не удалением строки, а сменой точки: написать строку замены с нужным адресом и портом. Ограничение доступа к узлу — задача межсетевого экрана, а не этой строки.

Ищут в коде Хаба и находят живые имена

§ 3.3.1.25

Чем чреватоsmtp-ip и smtp-port в исходниках Хаба есть — но принадлежат MailerQ, другому MTA, где они не устарели и означают своё. Поиск по имени наводит на мысль, что Хаб пишет устаревшую пару в конфигурацию PowerMTA, хотя это не так.
Как заметитьПоиск по коду даёт совпадения в файлах с Mailerq в имени.
Как правильноСмотреть, к какому MTA относится файл. Конфигурацию PowerMTA собирают PmtaConfigBuilder и его шаблоны — там только строки замены.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
smtp-ip <address>
Значения
адрес или диапазон; полной грамматики руководство для этого имени не приводит
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
Global
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Пишется в корне файла конфигурации и действует на экземпляр целиком: ни блоков, ни наследования у неё нет. У замены область такая же, но строк может быть несколько, и каждая описывает свою точку приёма — это и было причиной замены.
Как проверить на узле
Смотреть надо все три имени сразу: устаревшую пару и замену, которая её обесценивает:
grep -rn 'smtp-ip\|smtp-port\|smtp-listener' /etc/pmta/
ss -lntp | grep pmta
Вторая команда показывает, что узел слушает на самом деле. Расхождение с написанным в файле обычно и означает смешанную конфигурацию: MTA взял строки замены и не взглянул на пару.
В Хабе
Цена ошибки
безопасно: неверное значение ничего не ломает
Сценарии
Жизненный цикл конфигурации