Colobridge WIKI

решение проблем с очередью отправляемой почты в postfix

Применимость: Linux, Postfix

Слова для поиска:


Как решить проблемы с отправкой почты?

Для выявления проблем можно использовать различные средства.

  • mailq – утилита для просмотра списка сообщений, находящихся в почтовых очередях.
  • postsuper – утилита обслуживания почтовых очередей. Одним из применений является удаление какого-либо сообщения или повторная установка его в очередь на доставку.
  • postqueue также создана для управления очередями. ОТличие от postsuper в том, что для работы c postsuper требуются права root, а для postqueue таких широких полномочий не нужно, хотя за счет этого теряется часть функционала.
  • postcat – утилита, позволяющая посмотреть содержимое файла почтовой очереди.

Инициировать немедленную доставку:

postsuper -r ALL; postfix flush

Толкнуть конкретное письмо по ID:

postsuper -r ID

Удалить письмо по ID:

postsuper -d ID

Инициировать внеплановый процесс отправки сообщений, присутствующих в очереди:

 postqueue -f

Показать содержимое очереди:

 postqueue -p

Показать всех получателей, кому письма не были доставлены

for i in `find /var/spool/postfix/defer/ -type f`; do cat $i | grep recipient | sed 's/=/ /' | awk '{print $2}'; done | sort | uniq

Просмотреть размеры очередей Postfix

for i in active bounce corrupt defer deferred flush hold incoming maildrop public saved trace; do echo -n "$i "; find "/var/spool/postfix/$i" | wc -l; done

Инициировать доставку накопившихся в очереди сообщений для домена test.ru:

 postqueue -s test.ru

Просмотр отдельного сообщения:

postcat -q 5C4F468EC41 | less

Очистить из очереди домены по заданной маске:

 mailq| ./agr_mailq.pl|grep -E 'MAILER-DAEMON|yahoo|\.de|\.fr|\.it|\.ch'|awk '{print $1}'\
   | tr -d '*!'|xargs  -J{} -n1 postsuper -d {} deferred
 mailq| ./agr_mailq.pl|grep -E 'MAILER-DAEMON|yahoo|\.de|\.fr|\.it|\.ch'|awk '{print $1}'\
   | tr -d '*!'|xargs  -J{} -n1 postsuper -d {}

где agr_mailq.pl скрипт следующего содержания:

   #!/usr/bin/perl
   my $cur_line="";
   while(<>){
       chomp();
       if (/^[\w\d\*]+\s+\d+/){
           print "$cur_line\n";
           $cur_line=$_;
       } else {
           s/\s+//s;
           $cur_line .= "\t" . $_;
       }
   }

Отфильтровать и удалить из очереди только сообщения на 5 и более адресов разом:

 mailq |./agr_mailq_big.pl| tr -d '*!'|xargs  -J{} -n1 postsuper -d {}

где agr_mailq_big.pl:

   #!/usr/bin/perl
   my $cur_line="";
   my $counter=0;
   while(<>){
       chomp();
       if (/^[\w\d\*]+\s+\d+/){
           if ($counter >= 5){
               print "$cur_line\n";
           }
          $cur_line=$_;
           $counter=0;
       } else {
           s/\s+//s;
           $cur_line .= "\t" . $_;
           $counter++;
       }
   }
Посмотреть список доменов в очереди и число сообщений для них:

 mailq |./agr_mailq.pl |awk '{print $7}'|cut -d'@' -f2|sort|uniq -c|sort -r -n

Записав такие домены в файл, можно вручную отсеять нормальные домены и затем разом удалить мусор из очереди:

 mailq| ./agr_mailq.pl|grep -f ./spamdomains.list |awk '{print $1}'\
    | tr -d '*!'|xargs  -J{} -n1 postsuper -d {}

Удаление группы писем от определенного FROM (на примере MAILER-DAEMON):

FreeBSD:
mailq | grep 'MAILER-DAEMON' | awk '{print $1}' | xargs -I{} -n1 postsuper -d {}
Linux:
mailq | grep 'MAILER-DAEMON' | awk '{print $1}' | xargs -I{} -n1 /usr/sbin/postsuper -d {}

Удаление группы писем от определенного FROM в статусе REQUIRE:

mailq | grep 'MAILER-DAEMON' | awk '{print $1}' | tr -d '*' | xargs -I{} -n1 postsuper -d {}

Вы можете обнаружить неожиданные проблемы если будете использовать для монтирования файловой системы опции noexec и noatime с целью укрепления защиты системы.

Учитывайте, что Postfix не сможет корректно управлять очередью при использовании этих опций.

Проверьте где у вас расположена очередь сообщений и обеспечьте монтирование монтирование файловой системы с этой директорией без этих опций.

postconf queue_directory
 queue_directory = /var/spool/postfix

Или измените директорию командами:

mv /var/spool/postfix /home/
postconf -e queue_directory=/home/postfix
service postfix restart

Если вы используете опцию noexec для /tmp, то при выполнении

dpkg-reconfigure postfix

Вы можете получить сообщение об ошибке наподобие этого:

Preconfiguring packages ...
Can't exec "/tmp/postfix.config.49981": Permission denied at /usr/share/perl/5.10/IPC/Open3.pm line 168.
open2: exec of /tmp/postfix.config.49981 configure 2.5.5-1.1 failed at /usr/share/perl5/Debconf/ConfModule.pm line 59

Временно перемонтируйте /tmp без noexec, после успешного завершения dpkg-reconfigure можно вернуть все обратно