среда, 3 октября 2012 г.

Удаление писем из очереди postfix


Несомненно, каждый администратор unix подобной операционной системы сталкивался с необходимостью чистить очередь почтовых сообщений. Посмотреть очередь сообщений можно командой:

[root@server ~]# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
BD65F10DEE4*     4089 Wed Oct   3 00:29:01   sender@domain.ru
                                             resipient@domain.ru



C7D0E10DEE9      4457 Wed Oct   3 00:30:15   sender@domain.ru
(host imx1.rambler.ru[81.19.66.234] said: 452 4.7.1 Try again later (in reply to DATA command))
                                             recipient@rambler.ru


Как можно заметить в выводе команды две или три строки описывают одно письмо, поля вывода:

  1. Идентификатор сообщения в очереди, если после идентификатора стоит знак "*" - письмо находится в активной очереди на доставку, если знак "!" - письмо находится в очереди ожидания и попыток доставки его производится не будет.
  2. Размер сообщения.
  3. Время принятия письма.
  4. Отправитель сообщения.
  5. В выводе команды может быть указана причина по которой письмо не отправлено и осталось в очереди на доставку.
  6. Получатель сообщения.

Удалить письмо можно командой:

[root@server ~]# postsuper -d идентификатор_сообщения

Таким образом, посмотрев вывод mailq можно найти требуемое письмо по отправителю, получателю или по сообщению о не возможности доставки в данный момент (в примере rambler.ru просит нас отправить письмо позже). Все как бы хорошо, но что делать если в организации периодически производят рассылки и писем сотни или даже тысячи?  Достаточно просто сделать выборку по отправителю, т.к. отправитель и нужный нам идентификатор находятся в одной строке.

[root@server ~]# mailq | grep "sender" | awk '{ print $1 }' | sed s/*// | postsuper -d -

А если нужно сделать выборку по получателю или сообщению о не возможности доставки? Какого то готового рецепта я не нашел в интернете, хотя нужно было очень срочно. Итак, нужно все данные по каждому письму объединить в одну строку. Привожу ниже то что получилось у меня:

[root@server ~]# mailq | grep -v "Queue ID" | while read line; do if [ "1" != `echo $line | wc -m` ]; then echo -n " "$line; else echo""; fi ; done | grep "sender or non delivery message" | awk '{ print $1 }' | postsuper -d -

Используя свои данные вместо тех что указаны в примере "sender or non delivery message" можно легко очистить очередь от ненужных писем.