Применимость: Linux, Postfix
Слова для поиска:
Как решить проблемы с отправкой почты?
Для выявления проблем можно использовать различные средства.
Инициировать немедленную доставку:
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 можно вернуть все обратно