Перевод выполнен Алексеем Паутовым в рамках
некоммерческого проекта 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:connect | smtp banner |
События :defer заполняют одну дополнительную переменную: $event_defer_errno.
Для сложных операций в event_action может использоваться раскрытие ACL, однако, Exim использует много контекстов в течение его обработки, поэтому надо учитывать следующее:
Использование раскрытия 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 это вызовется для каждого элемента цепочки, включая загруженные локально.