Перейти к основному содержанию

Postfix — удаление писем из очереди

Mail

Иногда очень нужно почистить очередь сообщений в Postfix. Вот как мне сейчас.

Посмотреть всю очередь сообщений можно командой:

mailq

Или:

postqueue -p
1B85EC416F    54202 Sat Mar 18 11:00:07  noreply@example.com
       (connect to mail.microsoft.com[157.58.197.10]:25: Connection timed out)
                                         aaaaasssss@yndex.ru

1F319D246F*    35734 Wed Mar 22 10:33:41  noreply@example.com
(delivery temporarily suspended: connect to example-ru.mail.protection.outlook.com[104.47.13.36]:25: Connection timed out)
                                         clearing@example.ru

14922CD3EF!    35892 Tue Mar 21 08:01:45  noreply@example.com
(delivery temporarily suspended: connect to example-ru.mail.protection.outlook.com[104.47.14.36]:25: Connection timed out)
                                         clearing@example.ru

В результатах вывода имеем:

  • 1F319D246F — идентификатор сообщения письма в очереди
    • если после идентификатора стоит знак "*" — письмо находится в активной очереди на доставку
    • если после идентификатора стоит знак "!" — письмо находится в очереди ожидания, попыток доставки его производится не будет
  • 54202 — размер письма
  • 54202 Sat Mar 18 11:00:07 — дата и время принятия письма
  • noreply@example.com — отправитель
  • (delivery temporarily suspended: connect to example-ru.mail.protection.outlook.com[104.47.13.36]:25: Connection timed out) — может быть указана причина, по которой письмо не отправлено и находится в очереди на на доставку
  • aaaaasssss@yndex.ru — получатель

Удалить письмо можно по идентификатору:

postsuper -d 1F319D246F

Таким образом, с помощью mailq можно найти требуемые письма по отправителю, получателю или по сообщению о не возможности доставки. А потом удалить их.

Удалить письмо по отправителю:

mailq | grep "noreply@example.com" | awk '{ print $1 }' | tr -d '*!' | postsuper -d -

или

mailq | tail -n +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ($7 == "noreply@example.com" && $9 == "") print $1 } ' | tr -d '*!' | postsuper -d -

Удалить письмо по получателю:

mailq | tail -n +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ($8 == "aaaaasssss@yndex.ru" && $9 == "") print $1 } ' | tr -d '*!' | postsuper -d -

Удалить письмо по получателю, отправителю или причине:

mailq | grep -v "Queue ID" | while read line; do if [ "1" != `echo $line | wc -m` ]; then echo -n " "$line; else echo""; fi ; done | grep "Connection timed out" | awk '{ print $1 }' | tr -d '*!' | postsuper -d -

Бонус

Удалить письмо на нескольких серверах через соль по получателю:

salt "postfix*" cmd.run "mailq | tail -n +2 | grep -v '^ *(' | awk 'BEGIN { RS = \"\" } { if (\$8 == \"receiver@example.com\" && \$9 == \"\") print \$1 } ' | tr -d '*\!' | postsuper -d -"

Теги

 

Похожие материалы

Postfix — Multi Instance

Настроим несколько экземпляров postfix на одном сервере. Настраивать будем на Ubuntu 20.04 LTS. Postfix в режиме Multi Instance имеет один основной экземпляр и один или более дополнительных экземпляров со своими файлами конфигурации. У меня будет всего два экземпляра postfix для отправки сообщений. Основной будет работать на порту TCP 26, дополнительный на TCP 27. IP у обоих один и тот же.

Теги

Postfix и DNS

Postfix обращается к DNS для доставки исходящей почты. Это критически важный процесс, который позволяет вашему почтовому серверу найти конечный пункт назначения для отправляемого письма.

Теги

Автоматически чистить почтовый ящик из Ubuntu

Понадобилось мне как-то автоматически стирать все письма из почтового ящика. Ящик был на Exchange, автоматически там можно удалять письма, но только в папку "Удалённые", что не совсем то что нужно. Не найдя нормального функционала автоматической очистки папки плюнул и решил с соседнего сервера Ubuntu кроном удалять письма из ящика. Итак, на сервере Ubuntu ставим пакет fetchmail:

Теги