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