mail-from

<rewrite-list>Хаб задаёт сам

Правило подмены обратного адреса конверта
в конфигурации это строкаmail-fromвнутри блока <rewrite-list>
То же имя ещё 1:<pattern-list><rewrite-list>— часть из них другие настройки, часть та же самая
Куда вернётся отказ

Строка из двух адресов: что заменяем и на что. Меняется конверт — адрес команды MAIL FROM, невидимый получателю; на него приходят отказы, и по нему приёмник проверяет SPF.

Звёздочка значит разное слева и справа. Слева это «совпасть с чем угодно», справа — «взять из исходного адреса». mail-from foo@* *@bar.com превращает foo@xyz.com в foo@bar.com: локальная часть осталась своя, домен подставлен.

Пустой адрес пишется как <> — так выглядит конверт отчёта о доставке. Его можно и ловить слева, и ставить справа; нельзя только одно: звёздочка справа, когда слева пусто, — брать из пустого адреса нечего.

Целевой адрес обязан быть в ASCII. Домен вида bücher.de в правой части недопустим.

Главная ловушка — SPF. Переписанный конверт приёмник проверяет по новому домену. Если у bounce.example.com нет своей записи SPF, разрешающей адреса узла, всё, что уходит с переписанным конвертом, получает fail — при том что у самого домена отправки зона в порядке.
Что делает Хаб. Пишет — по правилу на каждый домен отправки: mail-from *@<домен> bounce@bounce.<домен>. Ради этого всё и делается: асинхронные отчёты о недоставке приходят на bounce@bounce.<домен>, где их разбирает <bounce-processor> и отдаёт Хабу вебхуком. Включается галочкой в генераторе конфигурации; вместе с ней нужна запись SPF для bounce.<домен> — предупреждение об этом стоит прямо в шаблоне конфигурации.
Рекомендуемые значения

Формы левой и правой части — и это самая полезная таблица руководства:

Слева (что ловим) Совпадёт с
abcd@xyz.com ровно этим адресом
abcd@* этой локальной частью в любом домене
*@xyz.com любым адресом этого домена
*@* всеми, кроме пустого
<> пустым адресом конверта
Справа (на что меняем) Получится
abcd@xyz.com ровно этот адрес
abcd@* эта локальная часть, домен из исходного
*@xyz.com локальная часть из исходного, этот домен
<> пустой адрес

Что писать в парке. *@<домен> bounce@bounce.<домен> — одно правило на домен отправки: отказы собираются на своём поддомене, а разбирать их можно по домену исходного получателя.

Обе таблицы форм, запрет на не-ASCII в правой части и запрет звёздочки справа при пустом адресе слева — из руководства (§ 3.3.18.1). Правило для парка — наше.
Пример в конфигурации
# конверт уходит на свой поддомен отказов — по правилу на домен
<rewrite-list mta-hub-return>
    mail-from *@shop.example.com  bounce@bounce.shop.example.com    mail-from *@news.example.com  bounce@bounce.news.example.com
</rewrite-list>
Так собирает список Хаб. Заголовок From при этом не меняется — получатель по-прежнему видит адрес отправителя; переписан только конверт. Для каждого bounce.<домен> нужна своя запись SPF.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Переписывают конверт, не заведя SPF для нового домена

наш опыт

Чем чреватоПриёмник проверяет SPF по домену конверта. Без записи для bounce.<домен> каждое письмо получает fail, и это худший вариант из возможных: зона основного домена в порядке, а проверка не проходит.
Как заметитьРезкое падение доставляемости сразу после включения переписывания; в отчётах DMARC — провал по оси SPF.
Как правильноЗаводить запись SPF для каждого bounce.<домен> до включения галочки. Хаб предупреждает об этом в шаблоне конфигурации.

Путают конверт с заголовком From

§ 3.3.18.1

Чем чреватоСтрока меняет конверт, невидимый получателю. Ожидание «получатель увидит другой адрес» не выполняется, и правило кажется нерабочим.
Как заметитьВ доставленном письме From прежний, а отказы приходят на новый адрес.
Как правильноДля видимого адреса есть from-domain. Это две разные строки и два разных адреса.

Ставят звёздочку справа при пустом адресе слева

§ 3.3.18.1

Чем чреватоПравило недопустимо: брать из пустого адреса нечего. Руководство приводит именно этот случай примером неверного правила.
Как заметитьКонфигурация не применяется после правки списка.
Как правильноДля пустого конверта справа задавать конкретный адрес целиком или снова <>.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
mail-from <rewrite-rule>
Значения
адрес-образец и адрес-замена; звёздочка слева значит «любой», справа — «взять из исходного»
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<rewrite-list>
Сколько раз
можно повторять
Всё здесь — из руководства, с разделом.
Наследование
Наследования у правила нет: оно действует внутри своего блока <rewrite-list>. Наследуется ссылка на список. Руководство подключает список к <source>; ссылки из <virtual-mta> и <virtual-mta-pool> тоже существуют и наследуются по обычному порядку — пуловая достаётся участникам, собственная строка участника её перекрывает.
Как проверить на узле
Что реально ушло в конверте, видно в учёте — поле обратного адреса:
pmtaacctfind --output csv[orig,rcpt,vmta] /var/log/pmta/acct-*.csv | head -20
В поле orig должен стоять переписанный адрес. Дальше проверьте SPF именно для его домена: dig TXT bounce.shop.example.com +short обязано вернуть запись, разрешающую адреса узла.
В Хабе
Значение
Хаб подбирает сам — темп, стадия прогрева, метрики
Цена ошибки
опасно: последствия переживут откат
Сценарии
Классификация отказов · Подпись и аутентификация писем
Соседние настройки блока <rewrite-list>:from-domainВсе 2 директив блока →