EXIM CLI

Материал из Webko Wiki
Перейти к навигации Перейти к поиску
Exim-Logo.png

Exim — это так называемый MTA ( Mail Transfer Agent ), агент передачи сообщений, в просторечии - почтовик или почтовый сервер, использующийся в операционных системах Unix. Распространяется по свободной лицензии GPL, то есть доступен для распространения, использования и модификации. Exim, весьма распространен и в некоторых операционных системах является почтовым сервером по умолчанию.



ID сообщений и spool файлы

Идентификаторы сообщений в очередях Exim, представляют из себя буквенно-цифровые последовательности в верхнем и нижнем регистрах: XXXXXX-YYYYYY-ZZ и используются большинством команд администрирования очереди и логгирования в Exim.

Для каждого сообщения создаются три файла в spool директории ( зачастую это: /var/spool ). Если вы работает с данными файлами вручную, без использования описанных ниже команд и утилит, убедитесь что обработали все три файла, например, не оставив в очереди exim только один из них, удалив остальные.

Каталог /var/spool/exim/msglog содержит файлы со служебной информацией для каждого сообщения и именуются в соответствии с ID этого сообщения.

Каталог /var/spool/exim/input содержат файлы заголовков и данных, к ID сообщения в имени, добавлены суффиксы -H и -D, соответственно. Кроме того в этих директориях могут появляться хэшированные подкаталоги для работы с большими почтовыми очередями.

Получение базовой информации по Exim

Вывести количество сообщений в очереди:

root@localhost# exim -bpc

Печать списка сообщений в очереди. Выводятся, время постановки в очередь, размер, ID сообщения, отправитель, получатель:

root@localhost# exim -bp

Печать суммарной информации. Выводимые колонки: количество, объем, старейшее, последнее, домен.

root@localhost# exim -bp | exiqsumm

Чем в данный момент занимается Exim:

root@localhost# exiwhat

Тестирование маршрута доставки до указанного адреса:

root@localhost# exim -bt alias@localdomain.com
user@thishost.com
    <-- alias@localdomain.com
  router = localuser, transport = local_delivery
root@localhost# exim -bt user@thishost.com
user@thishost.com
  router = localuser, transport = local_delivery
root@localhost# exim -bt user@remotehost.com
  router = lookuphost, transport = remote_smtp
  host mail.remotehost.com [1.2.3.4] MX=0

Эмитировать SMTP транзакцию из командной строки, как если-бы сообщение пришло с указанного IP адреса. При этом будет показано прохождение и срабатывание проверок, фильтров и листов доступа (ACL). На самом деле, никакое сообщение никуда доставлено не будет.

root@localhost# exim -bh 192.168.11.22

Листинг всех настроек конфигурации exim:

root@localhost# exim -bP

Поиск очереди с помощью утилиты exiqgrep

Стандартная поставка сервера Exim включает в себя утилиту для поиска по очередям — exiqgrep, это самый оптимальный путь для решения данной задачи. Если вы используете конвейер команд, например из exim -bp в awk, grep, cut и т.д., вы просто усложняете себе жизнь. Различные ключи команды exiqgrep, позволяют достаточно тонко настроить критерии поиска.

Ключ -f используется для поиска сообщений конкретного отправителя

root@localhost# exiqgrep -f [luser]@domain

Ключ -r используется для поиска сообщений для определенного адресата

root@localhost# exiqgrep -r [luser]@domain

Ключ -o указывает искать сообщения, старее, указанного количества секунд. В примере, сообщения старее 1 дня:

root@localhost# exiqgrep -o 86400 [...]

Ключ -y ищет сообщения свежее указанного количества секунд. В примере, найти сообщения, пришедшие в течении последнего часа:

root@localhost# exiqgrep -y 3600 [...]

Ключ -s позволяет искать по размеру сообщения, совпадающего с заданным регулярным выражением:

root@localhost# exiqgrep -s '^7..$' [...]

Для поиска только среди заблокированных( замороженных ) сообщений, используйте ключ -z, или -x для поиска только среди не заблокированных. Еще несколько ключей отвечающих за вывод результатов поиска

Вывести только ID сообщения, в одном из вышеупомянутых вариантов поиска

root@localhost# exiqgrep -i [ -r | -f ] ...

Печатать счетчик сообщений при одном из вышеприведенных вариантов поиска:

root@localhost# exiqgrep -c ...

Вывести только идентификатор всей очереди:

root@localhost# exiqgrep -i

Управление очередями сообщений

Основной бинарник Exim ( /usr/sbin/exim ), используется с различными ключами для управления сообщениями в очереди. Многие ключи, подразумевают указание одного или более ID сообщения в командной строке, как раз тут вам и пригодится команда exiqgrep -i, которая была упомянута выше.

Запуск очереди:

root@localhost# exim -q -v

Запуск очереди только для локальных доставок:

root@localhost# exim -ql -v

Удалить сообщение из очереди:

root@localhost# exim -Mrm  [  ... ]

Очистит все заблокированные сообщения из очереди:

root@localhost# exipick -zi | xargs exim -Mrm

Очистит все сообщения из очереди:

root@localhost# exipick -i | xargs exim -Mrm 

Заблокировать( заморозить ) сообщение:

root@localhost# exim -Mf  [  ... ]

Разблокировать сообщение:

root@localhost# exim -Mt  [  ... ]

Доставить сообщение, вне зависимости от состояния блокировки или времени повторной доставки:

root@localhost# exim -M  [  ... ]

Доставить сообщение, только если достигнуто время для повторной доставки:

root@localhost# exim -Mc  [  ... ]

Принудительно остановить сообщение с формулировкой "отменено администратором":

root@localhost# exim -Mg  [  ... ]

Удалить все заблокированные сообщения:

root@localhost# exiqgrep -z -i | xargs exim -Mrm

Удалить все сообщения, старше 5 дней (86400 * 5 = 432000 секунд):

root@localhost# exiqgrep -o 432000 -i | xargs exim -Mrm

Заблокировать все письма от указанного отправителя:

root@localhost# exiqgrep -i -f luser@example.tld | xargs exim -Mf

Просмотреть заголовки сообщений:

root@localhost# exim -Mvh 

Просмотреть тело сообщений:

root@localhost# exim -Mvb 

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

root@localhost# exim -Mvl 

Добавить получателя в сообщение:

root@localhost# exim -Mar   [  ... ]

Редактировать отправителя сообщения:

root@localhost# exim -Mes  

Поиск в журнальных файлах с помощью exigrep

Утилита exigrep ( не путайте с exiqgrep, использующейся для поиска в очереди ), используется для поиска по лог файлам. Например exigrep может вывести все записи из лог файла с совпадающим ID сообщения, что довольно удобно, учитывая что каждое сообщение занимает 3 строки в лог файле.

Поиск сообщений отправленных с определенного IP адреса:

root@localhost# exigrep '<= .* \[12.34.56.78\] ' /path/to/exim_log

Поиск сообщений отправленных на определенный IP адрес:

root@localhost# exigrep '=> .* \[12.34.56.78\]' /path/to/exim_log

Данный пример ищет сообщения содержащие символы "=>", и отправленные на адрес "user@domain.tld", далее по конвейеру, результат передается команде grep, которая из полученного результата выбирает строки, содержащие "<=" с информацией об отправителе, почтовом адресе, IP адресе, размере сообщения, ID сообщения и заголовок subject, если логгирование этой строки включено.

root@localhost# exigrep '=> .*user@domain.tld' /path/to/exim_log | fgrep '<='

Генерировать из лог файла и показать статистику Exim:

root@localhost# eximstats /path/to/exim_mainlog

То-же что и выше но с более подробными данными:

root@localhost# eximstats -ne -nr -nt /path/to/exim_mainlog

Аналогично но за определенный день:

root@localhost# fgrep YYYY-MM-DD /path/to/exim_mainlog | eximstats

В качестве дополнения

Удалить все сообщения в очереди, содержащие в теле, определенную строку:

root@localhost# grep -lr 'a certain string' /var/spool/exim/input/ | \
                sed -e 's/^.*\/\([a-zA-Z0-9-]*\)-[DH]$/\1/g' | xargs exim -Mrm

Командой выше, мы проверяем содержимое каталога /var/spool/exim/input/, в поисках файлов очереди, содержащих определенную строку в теле сообщения, поскольку команда exiqgrep не умеет просматривать тело сообщений. Если вы решите удалить найденные файлы напрямую, ЭТО БУДЕТ НЕ ПРАВИЛЬНО, используйте предназначенные для этого команды exim. Если вывод используемой команды слишком длинный, например ID сообщений при exiqgrep -i, которые нужно передать дальше по конвейеру команде exim, может быть превышено количество аргументов командной строки вашей системной оболочки. В этом случае передавайте результат поиска через конвейер, команде xargs, которая будет обрабатывать результаты ограниченными порциями. Например удалим тысячи сообщений, отправленных с адреса joe@example.com:

root@localhost# exiqgrep -i -f  | xargs exim -Mrm  

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

root@localhost# kill -HUP `cat /var/spool/exim/exim-daemon.pid`