Очередь Postfix: команды диагностики, очистки и повторной доставки
Очередь Postfix нельзя обслуживать методом «удалить всё и перезапустить». Ниже — рабочая инструкция: как посмотреть очередь, найти причину задержки, прочитать конкретное письмо, повторить доставку, поставить письмо на hold, снять hold и удалить только то, что действительно нужно.
1. Проверяем состояние Postfix и диска
systemctl status postfix --no-pager
postfix status
df -h
df -iЕсли закончился диск или inode, сначала решите эту проблему. Очистка очереди не лечит переполненный раздел.
2. Показываем очередь
postqueue -p
# то же через совместимый интерфейс
mailqДля Postfix 3.1+ доступен JSON Lines:
postqueue -j | head
postqueue -j | wc -lКаждая строка postqueue -j — отдельное сообщение. В поле queue_name видно, находится оно в active, deferred, hold и т. п.
3. Считаем deferred и hold
postqueue -j | grep -c '"queue_name": "deferred"'
postqueue -j | grep -c '"queue_name": "hold"'На разных сборках JSON может форматироваться без пробела после двоеточия, поэтому для автоматизации лучше использовать jq:
postqueue -j | jq -s '[.[] | select(.queue_name=="deferred")] | length'
postqueue -j | jq -s '[.[] | select(.queue_name=="hold")] | length'4. Берём queue ID и смотрим историю в логах
Предположим, проблемное письмо имеет ID ABC123DEF.
journalctl -u postfix --since '24 hours ago' | grep 'ABC123DEF'
# если дистрибутив пишет в обычный mail.log
grep 'ABC123DEF' /var/log/mail.log 2>/dev/nullПо одному queue ID обычно видно приём письма, фильтрацию, попытки доставки и ответ удалённого сервера.
5. Посмотреть содержимое сообщения
postcat -q ABC123DEFТак можно проверить заголовки, sender/recipient и понять, действительно ли письмо нужно удалять. Не публикуйте вывод postcat целиком: там могут быть персональные данные и содержимое письма.
6. Повторить доставку одного письма
postqueue -i ABC123DEFСначала устраните причину defer: DNS, сетевую ошибку, недоступный relayhost, TLS, авторизацию или локальную доставку.
7. Повторить доставку всей очереди
postqueue -fНе запускайте flush каждую минуту. Postfix сам планирует повторные попытки; частый принудительный flush только создаёт лишнюю нагрузку.
8. Поставить письмо на hold и снять hold
# остановить дальнейшие попытки доставки
postsuper -h ABC123DEF
# вернуть письмо из hold
postsuper -H ABC123DEF9. Переотправить письмо через очередь заново
postsuper -r ABC123DEFRequeue заставляет Postfix снова пройти обработку сообщения. Это полезно после изменения transport maps, маршрутизации или фильтров.
10. Удалить одно конкретное сообщение
postsuper -d ABC123DEFПеред удалением сохраните queue ID и причину проблемы, если это часть расследования.
11. Массовое удаление: только когда вы понимаете последствия
# удалить ВСЮ очередь — крайне опасно
postsuper -d ALL
# удалить только deferred
postsuper -d ALL deferredНе выполняйте эти команды просто потому, что очередь большая. Сначала выясните, почему она выросла. Иначе через несколько минут получите ту же очередь снова, только уже без потерянных писем пользователей.
12. Типовая диагностика deferred
# DNS
dig MX example.net
dig A mx.example.net
# маршрут и соединение
nc -vz mx.example.net 25
# TLS SMTP
openssl s_client -connect mx.example.net:25 -starttls smtp -servername mx.example.net
# текущий relayhost
postconf relayhost
# последние ошибки Postfix
journalctl -u postfix --since '1 hour ago' --no-pager | tail -n 20013. Если очередь растёт из-за взломанной учётки
- заблокируйте или смените пароль SMTP-учётки;
- проверьте SASL auth в логах;
- остановите источник массовой отправки;
- только после этого удаляйте спам из очереди;
- проверьте reputation/IP blocklists и ограничения провайдера.
14. Контроль после исправления
postqueue -p
postqueue -j | wc -l
journalctl -u postfix --since '10 min ago' --no-pagerКритерий успеха: очередь уменьшается без ручной очистки, новые письма доставляются, deferred не растёт, а в логах исчезла повторяющаяся причина задержки.