Удалить/Очистить/Сбросить очередь в postfix
Иногда, приходиться удалять письма из очереди, и если не знаете как это сделать ( или может забыли), то данная тема поможет с этим разобраться.
Для начала, проверим что иметься в очереди:
$ postqueue -p
У меня например, образовалось вот такая очередь:
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
CA0664A220C9 438 Wed Apr 5 19:34:35 root@linux-notes.org
(connect to example.org[2606:2800:220:1:248:1893:25c8:1946]:25: Connection timed out)
user@example.org
CC3B64A220C4 430 Wed Apr 5 19:30:46 root@linux-notes.org
(connect to example.org[93.184.216.34]:25: Connection timed out)
user@example.org
7BCF14A22CCE 3231 Fri Apr 7 14:21:23 MAILER-DAEMON
(connect to captain-notes[/var/lib/imap/socket/lmtp]: No such file or directory)
www@linux-notes.org
-- 4 Kbytes in 3 Requests.
Или, имеется другая утилита:
$ mailq
Чтобы сохранить результат в текстовый файл, можно запустить:
$ postqueue -p > mailq_output.txt
или
$ mailq >mailq_output.txt
Просмотр сообщения (Содержимое, заголовок и тело)
Предположим, что сообщение имеет идентификатор XXXXXXX (я выше показывал как )
$ postcat -vq XXXXXXXXXX
Или, сохраняем в файл:
$ postcat -vq XXXXXXXXXX > msg_output.txt
Удалить/Очистить/Сбросить очередь в postfix
Если есть необходимость удалить конкретное письмо ( нужно знать его ID), выполните команду:
# postsuper -d mail_queue_id
Чтобы очистить очередь в Postfix MTA просто введите следующую команду:
# postfix flush
Или:
# postfix -f
Чтобы удалить всю почту из очереди, введите:
# postsuper -d ALL
Чтобы удалить все письма в отложенной очереди (deferred), введите:
# postsuper -d ALL deferred
Чтобы удалить все письма из почтовой очереди, которые пришли с test_user@linux-notes.org или отправлены на адрес test_user@linux-notes.org (команда одинакова независимо от того, является ли это адресом отправителя или получателя), вы можете использовать следующую команду:
# mailq | tail -n +2 | awk 'BEGIN { RS = "" } /test_user@linux-notes\.org$/ { print $1 }' | tr -d '*!' | postsuper -d -
Или
# mailq | tail -n +2 | grep -v '^ *(' | \
gawk 'BEGIN {RS = ""} /test_user@linux-notes.org/ {print $1}' | \
tr -d '*!' | sudo postsuper -d -
Ничего сложного в этом нет.
Нашел в интернете, готовый скрипт, который удаляет всю почту из mailq, которая соответствует регулярному выражению (указанному в качестве первого аргумента).
$ vim drop_email_queue.pl
И прописываем в него:
#!/usr/bin/perl
$REGEXP = shift || die "no email-adress given (regexp-style, e.g. bl.*\@yahoo.com)!";
@data = qx</usr/sbin/postqueue -p>;
for (@data) {
if (/^(\w+)(\*|\!)?\s/) {
$queue_id = $1;
}
if($queue_id) {
if (/$REGEXP/i) {
$Q{$queue_id} = 1;
$queue_id = "";
}
}
}
#open(POSTSUPER,"|cat") || die "couldn't open postsuper" ;
open(POSTSUPER,"|postsuper -d -") || die "couldn't open postsuper" ;
foreach (keys %Q) {
print POSTSUPER "$_\n";
};
close(POSTSUPER);
Например, удалите все поставленные в очередь сообщения (исходящие и входящие) для http://linux-notes.org:
# ./drop_email_queue.pl linux-notes.org
Удалите все сообщения в очереди, содержащие слово «world»:
# ./drop_email_queue.pl world
У меня, по данной статье «Удалить/Очистить/Сбросить очередь в postfix» все.
Скрипт НЕ работает ((
А что не работает? Ошибку какую выдает?