file-destination

<domain>

Куда очередь пишет файлы — каталог или имя файла
в конфигурации это строкаfile-destinationвнутри блока <domain>
Путь, в который можно подставить свойства письма

Работает у очереди вида file (type). Задаёт каталог — если file-format создаёт файл на письмо — или имя файла, если письма дописываются в общий.

Путь не обязан быть постоянным. В нём раскрываются те же подстановки, что и в командной строке программы-обработчика: $isodate — дата вида 2026-08-28, $domain — домен получателя, $user — его имя до собаки (а если в нём есть + — то часть слева от него), $from и $to — адреса конверта, $envid, $timet, $ctime, $rfctime, $bodytype.

Регистр раскрытия разный. $user и $domain всегда приводятся к нижнему регистру — чтобы не плодить два каталога на разном регистре одного имени. $from и $to зависят от macro-variables-preserve-case.

Главная ловушка — путь без подстановок. Каталог, в который валится всё подряд, за неделю набирает сотни тысяч файлов, и операции с ним начинают стоить дороже самой доставки. Разделите его хотя бы по дате: $isodate в пути — одна строка, а разница между каталогом на день и каталогом на год.
Что делает Хаб. Не пишет: очередей вида file не заводит. Если такая очередь понадобится, путь стоит собирать с $isodate — иначе разбор архива упрётся в файловую систему, а не в объём писем.
Рекомендуемые значения

Дата в пути — минимум. $isodate разбивает архив по суткам и делает его пригодным для удаления по возрасту.

$domain полезнее $to. Имя каталога из домена получателя читаемо и не плодит по каталогу на адрес.

Каталог должен существовать заранее. Подстановки раскрываются в путь, но каталоги узел за вас не создаёт — в отличие от входящей в поставку программы newfile, которая это умеет.

Совет про подстановку даты и предупреждение о заранее созданном каталоге — наши. Из руководства здесь полный список подстановок и правило регистра: имя получателя и его домен всегда в нижнем.
Пример в конфигурации
# архив разложен по суткам и доменам
<domain archive.example.com>
    type file
    file-format newfile-pickup
    file-destination /var/spool/archive/$isodate/$domain/</domain>
Обе подстановки раскрываются в нижнем регистре — $domain всегда, независимо от того, как домен написан в адресе.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Пишут всё в один каталог

наш опыт

Чем чреватоЗа неделю в нём оказываются сотни тысяч файлов, и любая операция с каталогом — перечисление, удаление по возрасту — начинает стоить дороже самой доставки.
Как заметитьОбработка архива замедляется, хотя объём писем не растёт.
Как правильноДобавить $isodate в путь — по каталогу на сутки.

Рассчитывают, что каталог создастся сам

§ 3.3.10.110.2

Чем чреватоПодстановки раскрываются в путь, но каталогов узел не создаёт. Письма остаются в очереди, а причина видна только по правам и наличию каталога.
Как заметитьОчередь вида file растёт, файлов на диске нет.
Как правильноСоздать каталоги заранее — либо перейти на очередь вида pipe с входящей в поставку программой newfile, она их создаёт сама.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
file-destination <path>
Значения
путь к каталогу или к файлу; допускаются подстановки $isodate, $domain, $user, $from, $to, $envid, $timet, $ctime, $rfctime, $bodytype
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<domain>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Значение сливается по блокам <domain> от общего к частному: побеждает наиболее подходящий блок, а не последний по файлу. В очереди другого вида строка игнорируется. Подхватывается по pmta reload; письма, уже стоящие в очереди, уедут по новому пути.
Как проверить на узле
Значение печатает команда настроек очереди; раскрылся ли путь как задумано, видно по самому каталогу:
pmta show settings archive.example.com/vmta1 | grep -i file-destination
find /var/spool/archive/ -name '*.msg' -newermt '-1 hour' | head
Пустой ответ второй команды при непустой очереди обычно означает, что каталога из подстановки не существует: узел его не создаёт. Хаб очередей вида file не заводит.
В Хабе
Цена ошибки
опасно: последствия переживут откат
Сценарии
Подключить платформу отправки