Отдать письмо программе на этом же узле

pipe delivery
Программа вместо приёмника

Очередь вида pipe не устанавливает соединений. На каждого нового получателя она запускает программу из строки command и пишет письмо ей на стандартный вход. Как программа с ним поступит — дело программы.

Обычное применение — разбор отказов и жалоб: домен обратного адреса заводится очередью вида pipe, и всё, что на него приходит, сразу попадает в обработчик, минуя почтовый ящик.

Особый домен local. Он собирает почту всем получателям на локальных доменах узла — узел определяет их по имени машины и по своим строкам host-name. Оговорка руководства важная: /etc/aliases и .forward PowerMTA не читает, так что привычная почтовая пересылка unix здесь не работает.

Главная ловушка — процесс на получателя. Программа запускается на каждого нового получателя, а не на пачку и не один раз. Обработчик, который стартует полсекунды, при тысяче отказов в минуту съест узел целиком. Для потока лучше подходит вид http-delivery: там обработчик один и живёт своей жизнью.
Что делает Хаб. Не пользуется. Письма с отказами и жалобами разбирают на самом узле встроенные обработчики MTA — <bounce-processor> и <feedback-loop-processor>, — а в Хаб уезжают уже записи учёта вебхуком. Если обработчик-программа на узле всё же понадобится, pipe уместен на редком потоке, а на частом лучше вебхук.
Пример в конфигурации
# разбор отказов программой на этом же узле
<domain bounces.example.com>
    type pipe
    command "/opt/bounce/parse --envid \"$envid\" \"$user\""</domain>

# вся почта локальным получателям — в procmail
<domain local>
    type pipe
    command "/usr/bin/procmail -t -Y -d $user"</domain>
Кавычки вокруг подстановок не для красоты: в адресе бывают пробелы, и без них он разъедется на несколько аргументов командной строки.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Ставят pipe на поток

§ 11.21

Чем чреватоПрограмма запускается на каждого получателя. При тысяче писем в минуту это тысяча процессов в минуту — узел уходит в нагрузку на запусках, а не на почте.
Как заметитьСредняя загрузка узла растёт вместе с очередью вида pipe, отправка при этом не увеличилась.
Как правильноДля потока брать вид http-delivery: там обработчик один и переживает нагрузку сам.

Ждут, что заработают /etc/aliases и .forward

§ 11.21.1

Чем чреватоPowerMTA их не читает — руководство говорит об этом прямо. Пересылка, настроенная привычным для unix способом, молча не срабатывает.
Как заметитьПочта на локальные адреса приходит в обработчик, а не пересылается по алиасам.
Как правильноЗадавать пересылку строкой alias в конфигурации PowerMTA, а не файлами системы.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Как проверить на узле
Работает ли обработчик — видно по самой очереди: у вида pipe доставки идут без соединений:
pmta show settings bounces.example.com/vmta1 | grep -E '^type|^command'
pmta show queues | grep -i bounces.example.com
Растущая очередь вида pipe при заданной программе обычно означает, что она не запускается — проверьте права и путь. Хаб очередей этого вида не заводит.
В Хабе
Цена ошибки
опасно: последствия переживут откат
Сценарии
Приём входящей почты