четверг, 28 августа 2008 г.

Полезные утилиты Exim

Одним из главных плюсов 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 <info@lischer.com>
Лечится так
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
В выводе появится что-то типа
root@domain.ru [~]# 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 '<spamer@server.ru>' | xargs exim -Mrm

Хорошо бы только сначала посмотреть для пары наугад выбранных сообщений полную информацию. Или можно такое использовать (это уже извращение, разумеется) MID=`exiqgrep -i -f '<spamer@server.ru>'|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 A.User@a.domain.example -f himself@there.example

Это не все утилиты, которые идут с 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, но на самом деле это более глобальная программа которая анализирует логи многих программ и выводит статистику.

Ссылки



Заменка написана на основе официальной документации к Exim. В процессе написания использовались некоторые формулировки из перевода документации отсюда
Официальный сайт программы
Официальная Wiki Exim'а
Сайт VirtualExim
Сайт утилиты exilog
сайт Lire
FAQ по Exim MTA
Диспут на тему Exim vs Postfix
Virtual Domains with Exim + Courier-IMAP + MySQL
Установка почтового сервера на базе Exim

Комментариев нет: