Одним из главных плюсов Exim’а, без сомнения, являются утилиты, которые поставляются вместе с ним. Они могут значительно упростить рутинные операции, сократить ваши однострочники раз в 5, и дают возможность составлять сложные sh-скрипты для некоторых часто повторяемых действий с очередью и/или логами.
exiqgrep – Выборка из очереди.
Без опций будет идентично exim -bp
Самая главная опция это -h, которая выводит список всех опций.
-f <regexp; – регэксп совпадения с адресом отправителя
-r <regexp; – регэксп совпадения с адресом получателя
-s <regexp; – регэксп совпадения с полем размера (именно с полем размера, в том виде как оно указывается при выводе exim -bp)
регэкспы не надо заключать в //
-y <seconds; – выводит сообщения «младше» заданного количества секунд
-o <seconds; – выводит сообщения «старше» заданного количества секунд
-z – только frozen сообщения
-x – все кроме frozen
-c – Показать только количество совпадений (в зависимости от версии показывает либо просто число, либо фразу типа «15 matches out of 78 messages»
-l – Показывает полную информацию, как её выводит exim (включено по умолчанию)
-i – Показывает только IDs совпавших сообщений
-b – Показывает совпадения в «кратком» формате. Одна строка: ID, From и To
-R – Выводит сообщения в обратном порядке
Разумеется, опции можно комбинировать и делать вещи типа:
exiqgrep -zif ‘^<;$’
что выводит нам ID замороженных баунсов…
На основе этого можно написать такой вот скрипт
#!/bin/sh if ! [ `which exim 2;/dev/null` ]; then echo "Sorry, exim binary not found! Exit now." exit fi if ! [ `which exiqgrep 2;/dev/null` ]; then echo "Sorry, exiqgrep binary not found! Exit now." exit fi if [ "$1" == "cf" ]; then num_of_frz_mes=`sudo exiqgrep -zif '^<;$|wc -l` sudo exiqgrep -zif '^<;$'|xargs sudo exim -Mrm ; /dev/null echo "$num_of_frz_mes frozen bounces deleted" exit fi if [ "$1" == "c" ]; then num_of_mes=`sudo exiqgrep -if '^<;$'|wc -l` sudo exiqgrep -if '^<;$'|xargs sudo exim -Mrm ; /dev/null echo "$num_of_mes bounces deleted" exit fi num_of_mes=`sudo exiqgrep -if '^<;$'|wc -l` num_of_frz_mes=`sudo exiqgrep -zif '^<;$'|wc -l` echo "$num_of_mes bounces currently in the queue" echo "$num_of_frz_mes frozen bounces currently in the queue"
Запуск без опций показывает количество баунсов в очереди.
с – удалить все баунсы (не надо так делать!)
cf – удалить все frozen баунсы
А можно ускорить доставку для определённого домена (-v можно убрать, разумеется):
exiqgrep -i -r ‘domain.com$’ | xargs exim -v -M
Иногда, при использовании exiqgrep появляется такое
Line mismatch: 236d 1HOnvz-00069X-8w <[email protected];
Лечится так
exim -bpr | grep «^[0-9][0-9][0-9]d» | awk ‘{print $2}’ | xargs exim -Mrm
Я не буду рассасывать, что это значит и как такое получается потому, что это «выходит за рамки статьи».
exipick – показывает сообщения из очереди по разным критериям и в разных форматах
Создана как замена exiqgrep’у. Лично мне хватает последнего, но если захочется чего-нибудь помощнее читайте exipick —help или perldoc exipick
exiqsumm – Анализ очереди
Сама по себе эта утилита ничего не делает. На вход ей обязательно надо подать очередь exim’а.
exim -bp | exiqsumm
Вывод программы по умолчанию состоит из пяти колонок: количество сообщений на домен, их общий объем, время жизни самого старого, самого нового, и собственно домен назначения.
В конце вывода есть суммарные значения.
По умолчанию вывод сортируется по доменам в алфавитном порядке. Есть и другие опции
-a – сортирует по возрасту самого старого сообщения
-c – сортирует по количеству сообщений
-b – показывает баунсы отдельно, строчки помечаются (b). Т.е. для тех доменов где есть баунсы будет две строки, одна с b, другая без нее.
-f – показывает «замороженные» сообщения
-s – показывает и домен с которого отправлено и письмо, и домен получатель. Соответсвенно каждая «пара» считается отдельно.
А вот так можно выявлять спамеров.
exim -bp | exiqsumm -c -s | head
В выводе появится что-то типа
[email protected] [~]# exim -bp | exiqsumm -c -s | head Count Volume Oldest Newest Domain ----- ------ ------ ------ ------ 668 814KB 74m 66m server.ru ; yahoo.com 653 788KB 3h 66m server.ru ; mail.ru 68 82KB 66m 66m server.ru ; list.ru
Разумеется вместо server.ru будет qualify domain (подробнее см. опцию -f коммандной строки), или домен отправителя если шлют через SMTP.
Узнаем, что это за негодяй
exiqgrep -b -f ‘server.ru’ -r ‘mail.ru’ | awk ‘{print $3}’ | sort | uniq -c | sort -n | tail
Самый нижний он и есть.
Хотя все это можно сделать проще и за один заход, с помощью exiqgrep
exiqgrep -b | awk ‘{print $3}’ | sort | uniq -c | sort -n | tail
Ну и соответственно удалить всю очередь от него
exiqgrep -i -f ‘<[email protected];’ | xargs exim -Mrm
Хорошо бы только сначала посмотреть для пары наугад выбранных сообщений полную информацию. Или можно такое использовать (это уже извращение, разумеется) MID=`exiqgrep -i -f ‘<[email protected];’|tail -1`;exim -Mvl $MID; exim -Mvh $MID
Но вернемся к exiqsumm. У этой утилиты есть пара важных нюансов. Во-первых, считает она не сами сообщения а «доставки». И если некоторые сообщения имеют более одного получателя, то доставок будет больше чем сообщений. Во-вторых, домены на которые доставляется письмо в результате альясинга или форвардинга – не включаются (если не использовалась опция «one_time» роутера «redirect» для конвертации из в адреса «верхнего уровня»). Поэтому всегда надо смотреть логи.
exigrep – Выборка из логов
Утилита позволяющая банально «грепать» логи. От обычного грепа отличается тем, что выдет все строки для сообщения, у которого хотя бы в одной строке встречается паттерн. Иногда это удобно, иногда такое количество информации может быть излишним.
Использование
exigrep [-I] [-l] [-t ] [-v] []…
-I – включает регистрозависимость
-l – отключает обработку регулярных выражений в паттерне (все символы начинают обрабатываться «как есть»)
-t<n; – в качестве n нужно указывать количество секунд. Выводятся только сообщения, которые провели в очереди больше чем n секунд.
-v – опция идентична grep’овской. Выводит только строки не содержащие паттерн (вернее, строки относящиеся к сообщениям у которых ни в одной строке нет паттерна).
Логи можно подавать на стандартный ввод или через пробел после всех опций. Логи могут быть в архиве (вообще говоря, все это дело определяется опциями сборки ZCAT_COMMAND и COMPRESS_SUFFIX в файле Local/Makefile).
eximstats – Статистика на базе логов
Утилита парсит логи экзима (или syslog’а) и выводит статистический анализ по всем содержащимся сообщениям.
Вывод может быть в трех форматах: txt, html, xls (Excel).
Использование
eximstats [Output] [Options] mainlog1 mainlog2
По умолчанию скрипт выведет статистику в STDOUT в формате txt. Например можно сделать так
eximstats mainlog1 mainlog2 … ; report.txt
но лучше так
eximstats -txt=report.txt mainlog1 mainlog2
Вместо txt можно указать html или xls, чтобы вывод был в соответствующем формате.
Уже готовые отчеты можно объединить в один.
eximstats -merge -html [Options] report.1.html … ; weekly_rep.html
У программы масса опций, посмотреть их можно так
eximstats -help
или так
perldoc eximstats
Если отчеты в html, то можно даже png-графики выводить.
Описывать, что получается в отчете, смысла, думаю, нет. Стоит просто попробовать и посмотреть. Статистика очень мощная, если есть проблемы, они винды сразу.
exim_checkaccess – проверка приема для адреса с IP
Очень простая программа для проверки Relay. Заменяет «exim -bh». Используем так:
exim_checkaccess <IP address; <email address; [exim options]
IP – IP отправителя
email address – адрес который будет указываться в RCPT TO
Обе опции обязательные (к сожалению, я не нашел как проверить «с любого IP»). После опций можно добавить любые опции экзима. Т.к. утилита использует <; в качестве отправителя удобно использовать её так:
exim_checkaccess 10.9.8.7 [email protected] -f [email protected]
Это не все утилиты, которые идут с exim’ом. Описал только те, которые считаю наиболее полезными.
Остальные утилиты просто перечислю:
- exiwhat – список того, что делают процессы exim`a
- exicyclog – ротация лог-файлов
- exim_dbmbuild – сборка файла DBM
- exinext – извлечение информации повторов
- exim_dumpdb – дамп БД подсказок
- exim_tidydb – очистка БД подсказок
- exim_fixdb – правка БД подсказок
- exim_lock – блокировка файла почтового ящика (mailbox)
- eximon – показывает в X’ах информацию о состоянии очереди exim’a, и о том, что exim делает
Есть сторонние утилиты, типа
exilog – обеспечивает визуализацию логов от многих серверов exim’a.
Lire – аналог eximstats, но на самом деле это более глобальная программа которая анализирует логи многих программ и выводит статистику.