Работая с Exim, постоянно наталкиваешься на какие то проблемы, когда письмо зависает в очереди, по тем или иным причинам, либо хост не доступен, либо криво настроены повторы и встает задача, что то сделать с зависшими сообщениями. Собственно ниже, о том как бороться с очередями Exim
Способы очистки очереди:
Наиболее прямолинейный и грубый прием, тем не менее позволяющий очистить очередь безусловно, но настоятельно не рекомендую его использовать:
rm -rf /var/spool/exim/input/*
Корректный способ, имеющий так же результатом полную очистку очереди сообщений:
service exim stop;
rm -rf /var/spool/exim/input.bak;
mv /var/spool/exim/input /var/spool/exim/input.bak;
mkdir /var/spool/exim/input;
chown mailnull.mail /var/spool/exim/input;
chmod 750 /var/spool/exim/input;
service exim start;
Официальный способ очистки очереди:
exim -qff
Тоже самое с включенным дебаггом процесса:
exim -qff -d9
Собственно все тоже самое можно проделать скриптом. Как условие- все исполняемые файлы должны быть прописаны полностью, и пользователь стартующий скрипт должен быть доверенным для Exim’а.
Также данный скрипт может помочь в ситуации когда после доставки сообщения Exim куда то девает телосообщения, в результате чего письмо становится гостом и в листинге очереди exim -bp объем не указывается, в результате чего exiqgrep, не понимая о чем речь, выпадает с ошибкой.
Собственно скрипт убивающий сообщения из очереди, но оговорюсь сразу- письма уходят навсегда.
#!/bin/bash
# Определяем qualify_domain — он необходим для удаления всяческого мусора
domain=`exim -bP | grep -i “^qualify_domain” | sed -e s/.*\=\ //g`
# Прощаемся со всеми замороженными сообщениями
exim -bpr | grep ‘<' | awk '{print $2}' | grep '-' | xargs exim -Mrm 2> /dev/null
# при передаче скрипту параметра c, включаем агрессивный режим
if [ «$1» == «c» ]; then
# Удаляем все баунсы старше 20 минут
exiqgrep -o 1200 -if ‘^<>$’ |xargs exim -Mrm
# Сносим все сообщения с адресами начинающихся со спец.символов, таких как нижний подчерк, минус или тире
exiqgrep -f ‘^<\_|^<\-|^<\|' -i | xargs exim -Mrm
exiqgrep -r '^\_|^\-|^\|' -i | xargs exim -Mrm
#Выкашиваем сообщения отправленные на китайские домены, за последние 20 минут
exiqgrep -f "$domain" -r '.cn$' -o 1200 -i | xargs exim -Mrm
# Удаляем любые сообщения отправленные скриптами, если они зависли в очереди более чем на 12 часов
exiqgrep -f "$domain" -o 43200 -i | xargs exim -Mrm
exit
fi
# В мягком режиме удаляем только frozen баунсы и письма с невозможными адресами в заголовках
exiqgrep -zif '^<>$’ |xargs exim -Mrm
exiqgrep -f ‘^<\_|^<\-|^<\|’ -i | xargs exim -Mrm
exiqgrep -r ‘^\_|^\-|^\|’ -i | xargs exim -Mrm
##########################################
Работа с очередью Exim.
Когда возникает необходимость удалить одно или несколько замороженных сообщений из очереди, мы прибегаем к утилите Exipick:
exipick – показывает сообщения в очереди экзима
exipick -z – показывает замороженные сообщения
exipick -i – показывает ID сообщений
exim -Mrm ID – удаляет из очереди сообщение с определенным ID
В итоге получаем:
exipick -zi | xargs exim -Mrm //очистит все замороженные сообщения из очереди
exipick -i | xargs exim -Mrm //очистит все сообщения из очереди
exipick -i | xargs exim -Mg // Очистка почтовой очереди в MTA Exim. Сервер пытается немедленно доставить все письма, находящиеся в очереди. Если какое-либо письмо не удалось доставить, оно удаляется из очереди.