RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

56. События (Events)

Механизм событий в Exim может использоваться, чтобы прервать обработку в ряде ситуаций. Это было первоначально изобретено как способ сделать настроенные действия журналирования (например, обращения к базе данных), но может также использоваться, чтобы изменить некоторые действия обработки.

Большинство установок никогда не должно будет использовать события. Поддержку можно выключить при компиляции пакета, определив DISABLE_EVENT=yes в Local/Makefile.

Есть два главных класса событий: основной (main) и транспорт (transport). Параметр основной конфигурации event_action управляет событиями приема, опция транспортов event_action управляет событиями доставки.

Обе опции представляют собой строки, которые раскрываются, когда событие происходит. Например так:

event_action = ${if eq {msg:delivery}{$event_name} \
{${lookup pgsql {SELECT * FROM record_Delivery( \
    '${quote_pgsql:$sender_address_domain}',\
    '${quote_pgsql:${lc:$sender_address_local_part}}', \
    '${quote_pgsql:$domain}', \
    '${quote_pgsql:${lc:$local_part}}', \
    '${quote_pgsql:$host_address}', \
    '${quote_pgsql:${lc:$host}}', \
    '${quote_pgsql:$message_exim_id}')}} \
} {}}

У событий есть имена, которые соответствуют точке в процессе, в которой они сработают. Имя помещено в переменную $event_name. Текущий список событий:
Имя событияПроисходитКласс события Реакция на
msg:completeпослеmainсообщение
msg:deliveryпослеtransportполучателя
msg:rcpt:host:deferпослеtransport получателя или хост
msg:rcpt:deferпослеtransportполучателя
msg:host:deferпослеtransportпопытку
msg:fail:deliveryпослеmainполучателя
msg:fail:internalпослеmainполучателя
tcp:connectпередtransportсоединение
tcp:closeпослеtransportсоединение
tls:certпередобасертификат в цепочке проверки
smtp:connectпослеtransportсоединение

Новые типы событий могут быть добавлены в будущем.

Имя события это список, разделенный двоеточиями, определяющий тип случая в дереве возможностей. Это может использоваться в качестве списка или соответствовать только чему-то одному. В имени не должно быть пробелов.

Второй столбец в таблице выше описывает, когда сработает событие: до или после связанного с ним действия. Срабатывающие до могут влиять на связанное с ними действие (об этом ниже).

Дополнительная переменная, $event_data, заполнена информацией, меняющейся в зависимости от типа события:
Тип событияЧто будет в $event_data
msg:deliveryСообщение подтверждения smtp
msg:rcpt:host:deferСтрока ошибки
msg:rcpt:deferСтрока ошибки
msg:host:deferСтрока ошибки
tls:certглубина цепочки проверки
smtp:connectsmtp banner

События :defer заполняют одну дополнительную переменную: $event_defer_errno.

Для сложных операций в event_action может использоваться раскрытие ACL, однако, Exim использует много контекстов в течение его обработки, поэтому надо учитывать следующее:

  • Набор переменных в транспортных событиях не будет видим вне этого вызова транспорта.
  • Переменные acl_m в контексте сервера потеряны на новом соединении и после команд smtp helo/ehlo/mail/starttls/rset.

Использование раскрытия ACL с модификатором logwrite может быть полезным способом записи в основной журнал.

Раскрытие опции event_action должно обычно возвращать пустую строку. Если оно возвращает что-либо еще, следующее будет вызвано:
Тип событияЗначение
msg:deliveryигнорируется
msg:host:deferигнорируется
msg:fail:deliveryигнорируется
tcp:connectнет соединения
tcp:closeигнорируется
tls:certошибка верификации
smtp:connectсоединение закрыто

Никакого другого использования строки результата не сделано.

Для события tcp:connect, если соединение делается через прокси, переменные address и port будут адресом и портом прокси-сервера, а не целевой системы.

Для события tls:cert, если используется GnuTLS, это будет вызвано только для элемента цепочки, полученного в соединении. Для OpenSSL это вызовется для каждого элемента цепочки, включая загруженные локально.

Поиск

 

Найди своих коллег!