Всякие полезности для exim
11 Feb 2010 | Автор: dd |Ниже приводится вольный перевод статьи, посвященной хитростям работы с SMTP сервером Exim v. 4. Эта статья является более подробным изложением материала который я приводил в моем предыдущем посте о работе с очередью Exim. Какие то вводные могут пересекаться, но по сути это более подробная и развернутая инструкция.
Естественно, что использование этих команд не исключает необходимости познаний о работе сервисов SMTP, MTA и знакомства с шеллом UNIX.
Message-ID и spool файлы
Уникальные номера message-ID под которыми сервер Exim помещает письма в очередь, представляют собой набор буквено-циферных названий с вариацией регистра, и выглядят следующим образом: XXXXXX-YYYYYY-ZZ. Большинство команд изменения очереди используют эти уникальные message-id.
Каждому сообщению, в spool директории соответствуют три файла. Если вы хотите удалить напрямую файлы, не прибегая к командам работы с очередью, то вы должны быть уверены, что ваши изменения коснутся всех трех файлов, иначе Exim будет работать с остатками вытащенными из spool директории .
Файлы в папке /var/spool/exim/msglog содержат информацию о подключения для каждого сообщения и называются так же как и message-id письма.
Файлы в папке /var/spool/exim/input называются также как и message-id письма, в добавленным суффиксом после названия для различения информации содержащейся в файле: для заголовка (-H); для тела письма (-D).
Чаще всего эти директории содержат подпапки для удобства работы с большой очередью, поэтому не удивяйтесь если директории /var/spool/exim/input и /var/spool/exim/msglog будут заполнены алфавитными подпапками, поэтому все поиски и выборки, с помощью утилиты grep, должны быть производиться рекурсивно.
Основные команды
Вывод информации о количестве сообщений в очереди:
root@odminblog.ru# exim -bpc
Листинг сообщений находящихся в очереди (время в очереди, размер, message-id, адресат и получатель):
root@odminblog.ru# exim -bp
Вывод суммарного отчета по сообщениям в очереди (количество, размер, последнее письмо, наиболее раннее, домен и общий результат):
root@odminblog.ru# exim -bp | exiqsumm
Вывод информации о том, чем в данный момент занимается сервер Exim:
root@odminblog.ru# exiwhat
Трассировка алгоритма отправки по заданному адресу:
root@odminblog.ru# exim -bt test@yahoo.com
test@yahoo.com
router = dnslookup, transport = remote_smtp
host g.mx.mail.yahoo.com [98.137.54.238] MX=1
host f.mx.mail.yahoo.com [98.137.54.237] MX=1
host a.mx.mail.yahoo.com [67.195.168.31] MX=1
host a.mx.mail.yahoo.com [67.195.168.230] MX=1
host b.mx.mail.yahoo.com [74.6.136.65] MX=1
host h.mx.mail.yahoo.com [66.94.236.34] MX=1
host c.mx.mail.yahoo.com [206.190.54.127] MX=1
host d.mx.mail.yahoo.com [209.191.88.254] MX=1
Запуск “эмулятора” SMTP сессии из командной строки, таким образом словно он приходит на сервер с указанного IP адреса. Для данной отладки используются актуальные настройки сервера Exim, поэтому способ очень удобен для тестирования сервера, ACL и фильтров. Сообщение отправляется в эмулированной сессии, поэтому оно не будет доставлено.
root@odminblog.ru# exim -bh 192.168.10.1
**** SMTP testing session as if from host 192.168.10.1
**** but without any ident (RFC 1413) callback.
**** This is not for real!
Вывод всех настроек сервера Exim:
root@odminblog.ru# exim -bP
Поиск в очереди с помощью exiqgrep
К комплект Exim входит отличная утилита для выборки из почтовой очереди, именующаяся exiqgrep. С инфа с офф.сайта об использовании утилиты настойчиво рекомендовано просмотреть, ибо знание возможных ключей способно значительно облегчить жизнь сисадмина. Тем более что различные флаги могут сочетаться, для более подробного поиска в почтовой очереди.
Флаг -f позволяет искать в очереди сообщение от определенного отправителя, как по имени пользователя или домену, так и по полному адресу:
root@odminblog.ru# exiqgrep -f user@search.dom
Флаг -r позволяет искать в очереди письмо к определенному адресату или домену:
root@odminblog.ru# exiqgrep -r user@search.dom
Флаг -o выведет информацию о сообщениях старше определенного количества секунд. В примере для значения в 1 день:
root@odminblog.ru# exiqgrep -o 86400
Флаг -y выведет информацию о сообщения моложе определенного количества секунд. В примере для значения в 1 час:
root@odminblog.ru# exiqgrep -y 3600
Флаг -s выведет сообщение определенного размера, или при использовании видгета, определенного диапазона. Например от 500 до 599 байт:
root@odminblog.ru# exiqgrep -s ‘^5..$’
Флаг -z выведет только замороженные сообщения, или -x для только размороженных сообщений.
Еще несколько флагов для контроля вывода
Флаг -i выведет только message-id в качестве результата запроса:
root@odminblog.ru# exiqgrep -i [-o | -r | -f ]
Флаг -c выведет отчет о количестве сообщений из общего числа, удовлетворяющих условию поиска:
root@odminblog.ru# exiqgrep -c [-o | -r | -f ]
Листинг message-id всех сообщений находящихся в очереди:
root@odminblog.ru# exiqgrep -i
Управление очередью
Для управления сообщениями в очереди используется основной бинарник сервера exim, находящийся /usr/sbin/exim, в вариациях с различными флагами. Большая часть этих флагов требует задания одного или конвейера message-IDЮ заданных из командной строки.
Запуск очереди:
root@odminblog.ru# exim -q -v
Запуск очереди только для локальной доставки:
root@odminblog.ru# exim -ql -v
Удаление сообщения из очереди:
root@odminblog.ru# exim -Mrm <message-ID>
Заморозить сообщения для отправки:
root@odminblog.ru# exim -Mf <message-ID>
Разморозить сообщение:
root@odminblog.ru# exim -Mt <message-ID>
Доставить сообщение не зависимо от того заморожено оно или нет и истекло ли время повтора или нет:
root@odminblog.ru# exim -M <message-ID>
Доставить сообщение только если время повтора истекло:
root@odminblog.ru# exim -Mc <message-ID>
Удалить все замороженные сообщения:
root@odminblog.ru# exiqgrep -z -i | xargs exim -Mrm
Удалить все замороженные сообщения в очереди, старше определенного времени в секундах:
root@odminblog.ru# exiqgrep -o -860000 | xargs exim -Mrm
Заморозить все сообщения в очереди от данного отправителя:
root@odminblog.ru# exiqgrep -i -f user@test.com | xargs exim -Mf
Просмотреть заголовок письма:
root@odminblog.ru# exim -Mvh <message-ID>
Просмотреть тело письма:
root@odminblog.ru# exim -Mvb <message-ID>
Просмотреть логи относящиеся к данному письму:
root@odminblog.ru# exim -Mvl <message-ID>
Добавить адресата к сообщению:
root@odminblog.ru# exim -Mar <message-ID> <address> [<address>]
Изменить отправителя письма:
root@odminblog.ru# exim -Mes <message-ID> <address>
Access control
Сервер Exim дает возможность использовать так называемые листы контроля доступа( access control lists) для управления и фильтрацией на уровне SMTP диалога, которые задаются в разделе ACL конфигурационного файла сервера exim.conf. Начинать фильтрацию можно со строки SMTP диалога HELO.
# Использовать ACL после HELO
acl_smtp_helo = check_helo
# Выражения для проверки check_helo ACL:
check_helo:
deny message = Gave HELO/EHLO as “friend”
log_message = HELO/EHLO friend
condition = ${if eq {$sender_helo_name}{friend} {yes}{no}}
deny message = Gave HELO/EHLO as our IP address
log_message = HELO/EHLO our IP address
condition = ${if eq {$sender_helo_name}{$interface_address} {yes}{no}}
accept
*** Проверка HELO остается исключительно на вашей совести, поскольку строка HELO наименне важная в диалоге SMTP, поэтому не надо вешать на неё слишком много проверок, поскольку многие спамеры используют весьма информативные поля HELO, в то время как вполне законопослушные отправители, с кривых серваков, будут отметаться именно по этому полю. К тому же для спамера это наиболее простой способ избежать проверки- указать в поле HELO что дескать HELO im.an.ugly.spammer, так что в этой проверке не стоит устраивать допроса с пристрастием.
Следующим этапом идет проверка отправителя и хоста-отправителя. Ниже разобрано как сделать это после команды RCPT TO, что даст гораздо больше информации, нежели делать отлуп сразу по завершению строки MAIL FROM.
# Указать листу ACL отрабатывать после RCPT TO
acl_smtp_rcpt = check_recipient
# Выражение для check_recipient ACL
check_recipient:
# [...]
drop hosts = /etc/exim_reject_hosts
drop senders = /etc/exim_reject_senders
# [ Здесь же можно указывать и белые списки... ]
В данноом примере два текстовых файлика приводятся в качестве черных списков. В этих файлах следует указывать имена хостов/IPадреса в /etc/exim_reject_hosts, и почтовые адреса в /etc/exim_reject_senders, по одному на строчке
Также возможно использовать контекстное сканирование для проверки тела сообщения, но нужно помнить о том, что эта процедура затребует для сервера Exim гораздо больше CPU чем это необходимо при отсутствии этой проверки, особенно если письма большого размера.
# Указать ACL отрабатывать после поля DATA
acl_smtp_data = check_message
# Выражение для использования check_messages ACL
check_message:
deny message = “Sorry, Charlie: $regex_match_string”
regex = ^Subject:: .*Lower your self-esteem by becoming a sysadmin
accept
Исправление SMTP-Auth для почтового клиента Pine
Если клиенты pine не могут использовать SMTP аутентификацию на сервере Exim и получают ошибку “unable to authenticate” без запроса пароля, то для них следует использовать следующее выражение в конце конфига exim.conf. Выражение приводится для сервера Exim с поддержкой MySQL:
begin authenticators
fixed_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${lookup mysql{SELECT user_idnr FROM dbmail_users \
WHERE userid = ‘${quote_mysql:$2}’ AND passwd = ‘${quote_mysql:$3}’}}
server_set_id = $2
server_prompts = :
Эта проблема существовала довольно давно в CPanel Exim , но она добавляется в конфигурацию для стабильности системы.
Исправление SMTP-Auth для почтового клиента The Bat
Для использования почтового клиента The Bat с сервером Exim, следует прописать для него следующее выражение аутентификации с использованием алгоритма CRAM-MD5, в секции аутентификаций конфига exim.conf:
begin authenticators
auth_cram_md5:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${lookup mysql{SELECT passwd FROM dbmail_users \
WHERE userid = ‘${quote_mysql:$1}’}{$value}fail}
server_set_id = $1
Логирование темы письма
Одна из наиболее полезных конфигураций для Exim- логирование тем сообщений, проходящих через почтовый сервер. Добавляем в конфиг exim.conf, и можем смотреть какие сообщения признаны спамом:
log_selector = +subject
Reducing or increasing what is logged.
Отключение блокировки вложений
Для того чтобы отключить блокировку потенциально опасных вложений, которая применяется на многих Cpanel серверах по умолчанию, но осуществлять контроль на уровне доменов, следует добавить соответствующую блокировку в начало файла /etc/antivirus.exim:
if $header_to: matches “example\.com|example2\.com”
then
finish
endif
Просмотр логов с помощью утилиты exigrep
Утилита exigrep (не путать с exiqgrep) используется для поиска по лог файлам, используя произвольные выражения. Использование этой команды выведет все сообщения из лога с определенным message-id, подпадающим под данное выражение, что очень удобно, поскольку каждое сообщение оставляет в лог файле три записи, которые проблематично вывести с помощью стандартных команд.
Поиск письма посланного с определенного IP адреса:
root@odminblog.ru# exigrep ‘<= .* \[12.34.56.78\] ‘ /path/to/exim_log
Поиск письма посланного на определенный IP адрес:
root@odminblog.ru# exigrep ‘=> .* \[12.34.56.78\]‘ /path/to/exim_log
В данном поисковом запросе символ “=>” указывает исходящее сообщение, посланное на “user@domain.tld”. Символ “<=” указывает на входящее сообщение и отправителя письма, IP адрес отправителя, размер письма, message ID и тему письма, если данный параметр логирования включен.
root@odminblog.ru# exigrep ‘=> .*user@domain.tld’ /path/to/exim_log | fgrep ‘<=’
Сгенерировать и вывести статистику работы сервера Exim на основе лог файла:
root@odminblog.ru# eximstats /path/to/exim_mainlog
Сгенерировать и вывести статистику работы сервера Exim на основе лог файла, с менее информативным выводом:
root@odminblog.ru# eximstats -ne -nr -nt /path/to/exim_mainlog
Сгенерировать и вывести статистику работы сервера Exim за определенный день, на основе лог файла:
root@odminblog.ru# fgrep YYYY-MM-DD /path/to/exim_mainlog | eximstats
Удалить из очереди все сообщения содержащие в теле определенный набор символов:
root@odminblog.ru# grep -lr ‘a certain string’ /var/spool/exim/input/ | \
sed -e ‘s/^.*\/\([a-zA-Z0-9-]*\)-[DH]$/\1/g’ | xargs exim -Mrm
Для просмотра тел сообщений используется команда grep, поскольку утилита exiqgrep не умеет просматривать тело сообщения. Если удалить эти файлы напряму, то это будет не корректной обработкой очереди, поэтому настоятельно рекомендуется использовать приведенные команды.
Но поскольку в очереди может содержаться огромное количество message-ids (например вывод `exiqgrep -i` возвращает большой список значений) , то можно попасть под ограничение shell на количество вводимых аргументов. Поэтому вывод содержащий message-ids перенаправляется в xargs для избежания подобных ограничений. Например команда для удаления всех сообщений, посланных с адреса spam@evil.com, выглядит так:
root@odminblog.ru# exiqgrep -i -f ‘<spam@evil.com>’ | xargs exim -Mrm
Перегрузка конфигурации сервера
После внесения измененений в exim.conf, необходимо перегрузить основной pid сервера exim, для того чтобы демон перечел конфигурацию. В принципе можно выключить и включить сервис, но в этот момент можно потерять какое то количество сообщений. Поэтому делаем через kill:
root@localhost# kill -HUP `cat /var/spool/exim/exim-daemon.pid`
Этот рестарт отобразит в логе сервера exim_mainlog что нибудь вроде этого:
2010-02-11 12:08:56 pid 750: SIGHUP received: re-exec daemon
2010-02-11 12:08:56 exim 4.69 daemon started: pid=750, -q30m, listening for SMTP on port 25 (IPv4)
Read The Fucking Manual
The Exim Specification – Version 4.5x
Всякие полезности для exim,Теги: exim, почтовые системы
Автор:Рома на 16 Apr 2010
Классная статейка, то что искал. СПС за труд. Внёс её в свою локальную вику.
[Reply]
Автор:Alex на 02 Oct 2011
Подскажите, пожалуйста, где поменять имя отправителя в настройках exim?
К примеру есть почта TEST@domain.ru
и при получение писем с данного ящика в графе отправителя пишется TEST
А хотелось бы к примеру что бы писалось FOX.
[Reply]
anchous Reply:
October 2nd, 2011 at 3:27 pm
а что вам мешает указать в настройках почтового клиента данные отправителя хоть root@anydomain.aero ?
[Reply]
Автор:Сергей на 13 Dec 2012
Как напоминалку себе, но может и другим пригодится. Иногда не уходит письмо по непонятным причинам и даже включение в конфиге журналирования всего и вся не помогает. В таком случае можно попробовать отправить письмо в режиме отладки и результат вывести в файл:
exim -d -M > /var/log/exim-debug.log 2>&1
[Reply]
Автор:Сергей на 09 Jan 2013
небольшая правка к предыдущему сообщению:
exim -d -M > /var/log/exim-debug.log 2>&1
[Reply]
Автор:Тарас на 30 Mar 2015
Охренеть, Серег, ты так выручил :))))
[Reply]