Postfix удалить письмо из ящика

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

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

Идентификатор сообщения в очереди, если после идентификатора стоит знак «*» — письмо находится в активной очереди на доставку, если знак «!» — письмо находится в очереди ожидания и попыток доставки его производится не будет.
Размер сообщения.
Время принятия письма.
Отправитель сообщения.
В выводе команды может быть указана причина по которой письмо не отправлено и осталось в очереди на доставку.
Получатель сообщения.

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

[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» можно легко очистить очередь от ненужных писем.

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *