Вопрос или проблема
Недавно я обнаружил, что один из наших серверов Ubuntu генерировал дюжины уведомлений по электронной почте в минуту и лимитировал учетную запись реле Office 365, которую он разделял с несколькими другими серверами. Я остановил службу Postfix на этом сервере и отключил скрипты, которые генерировали все эти оповещения (и, как следствие, каскад сообщений о сбое доставки). Однако я не учел, что диспетчер очереди Postfix сохранил тысячи этих сообщений и пытается отправить их снова, когда я перезапускаю Postfix.
Моя первая, признаться, неуклюжая попытка очистить очередь заключалась в том, чтобы перейти в каталог очереди по адресу /var/spool/postfix
и вручную удалить файлы из папок ‘active’ и ‘incoming’. Однако, когда я запустил postqueue -p
, в очереди все еще отображались куча писем.
Как лучший способ полностью сбросить или очистить очередь Postfix?
Вы должны использовать команду postsuper
для удаления сообщений из очереди Postfix – Опция -d <queueid>
удалит сообщение с указанным идентификатором очереди.
Я использую такой скрипт для обработки всех сообщений в очереди:
mailq | awk '$7~/@/{print$1}' | while read qid; do postsuper -d $qid; done
Поскольку вы уже вмешивались в файлы очереди напрямую, вам может понадобиться выполнить postsuper -p
.
-p Очистка старых временных файлов, оставшихся после аварий системы или программ.
Много лет назад я написал маленький скрипт для более удобной обработки некоторых случаев в очередях почты postfix, вместо простых одноразовых команд. Возможно, он будет вам полезен в будущем.
$ cat /usr/local/sbin/postclear
#!/bin/bash
usage() {
echo "${0/*\/} --from <address1> [<address2> .. <addressN>]"
echo "${0/*\/} --bounce <address1> [<address2> .. <addressN>]"
echo "${0/*\/} --to <address1> [<address2> .. <addressN>]"
}
if [ $# -lt 2 ]; then
usage 1>&2 ;
exit 1;
fi
case $1 in
--from )
shift
while (( $# )) ; do
postqueue -p | grep -e "$1" | grep -Eo '^[A-F0-9]+' | postsuper -d -
shift
done
exit;;
--bounce )
shift
while (( $# )) ; do
postqueue -p | grep -E -B2 -e "$1" | grep MAILER-DAEMON | grep -Eo '^[A-F0-9]+' | postsuper -d -
shift
done
exit;;
--to )
shift
while (( $# )) ; do
postqueue -p | grep -E -B2 -e "$1" | grep -Eo '^[A-F0-9]+' | postsuper -d -
shift
done
exit;;
* )
echo "Неизвестная опция $1" >&2
exit 1;;
esac
Для того чтобы очистить всю очередь почты Postfix, вы можете использовать следующую команду:
postsuper -d ALL
.
Ответ или решение
Очищение или сброс очереди Postfix может оказаться важной задачей для системных администраторов, особенно в случае, когда сервер начинает генерировать большое количество ненужных или ошибочных сообщений. Это может повлиять не только на работу самого сервера, но и на работу связанных сервисов, таких как учетная запись Office 365, использующаяся для пересылки электронной почты, которая может быть заблокирована из-за чрезмерной активности. В представленном сценарии дана задача по полному очищению очереди сообщений Postfix на сервере под управлением Ubuntu. Для успешного выполнения этой задачи необходимо учитывать несколько ключевых моментов.
Теория
Postfix — это популярный агент пересылки электронной почты (Mail Transfer Agent, MTA), который широко используется в различных Unix-подобных операционных системах. Он отвечает за отправку и получение электронной почты и имеет систему очередей, через которые проходят все отправляемые и получаемые сообщения. В Postfix существуют различные типы очередей, такие как активная очередь, очередь входящих сообщений и т. д.
Одним из распространенных инструментов управления очередями является команда postsuper
, которая позволяет выполнять различные операции с почтовой очередью. Наиболее частыми действиями с очередью являются:
- Удаление сообщений: Использование
postsuper -d <queue_id>
для удаления конкретного сообщения по его идентификатору. - Проверка состояния очереди: С помощью команды
postqueue -p
можно просмотреть текущее состояние очереди и определить, какие сообщения в ней находятся.
Пример
В представленном случае изначально была предпринята попытка вручную удалить файлы сообщений из директорий в /var/spool/postfix
, таких как ‘active’ и ‘incoming’. Однако это привело к тому, что очередь оставалась заполненной при проверке с помощью команды postqueue -p
.
Более эффективным способом очистки бихqueue является использование postsuper
. Например, команда postsuper -d ALL
позволяет удалить все сообщения из очереди Postfix, полностью её очистив. Это решение подходит в случае, когда необходимо избавиться от большого количества сообщений, например, усыновившихся после сбоя в скриптах или из-за некорректной настройки.
Применение
Для вашего случая наилучшей практикой будет следующее:
-
Остановите службу Postfix перед выполнением любых операций с очередью. Это предотвратит отправку сообщений во время их удаления.
sudo systemctl stop postfix
-
Очистите очередь целиком с помощью
postsuper -d ALL
. Это гарантирует, что все сообщения, включая возможные частично поврежденные сообщения или ненужные уведомления об ошибках, будут удалены.sudo postsuper -d ALL
-
Проверьте наличие остаточных файлов и выполните чистку временных файлов. Это особенно важно, если вы уже пытались вручную удалять файлы из очереди.
sudo postsuper -p
-
Перезапустите службу Postfix, чтобы продолжить нормальную работу сервера.
sudo systemctl start postfix
-
Регулярно проверяйте логи и состояние почтовой очереди с помощью команд, таких как
postqueue -p
, для предотвращения повторения подобной ситуации.
В случае, если в будущем возникнут ситуации, когда нужно будет удалять определенные категории сообщений (например, от конкретного отправителя), можно использовать скрипты, работающие с выводом очереди. Пример такого скрипта предоставлен в описании задачи.
Выполнение этих шагов поможет вам содержать почтовую очередь в хорошем состоянии, минимизируя риск неправильной отсылки сообщений и обеспечивая надежное функционирование серверной инфраструктуры. Помните, что действие Postfix требует дисциплины и внимательного подхода, ведь работа с электронной почтой — это один из ключевых аспектов корпоративной ИТ-инфраструктуры.