Модуль запускает внешние программы, называемые фильтрами, на разных этапах сессии SMTP. Этапы нумеруются начиная с 0, всего таких этапов пять:
Этот фильтр, если он установлен, выполняется сразу после установления входящего SMTP-соединения. На этом этапе единственная информация, которая у нас есть, — это адрес IP клиента и его имя хоста из обратной записи DNS.
Этот фильтр, если он установлен, выполняется после того, как отправитель выдал команду HELO или EHLO, которая указывает (настоящее или поддельное) имя отправляющего хоста.
Этот фильтр, если он установлен, выполняется после того, как отправитель передал команду MAIL FROM, которая указывает (настоящий или поддельный) адрес электронной почты отправителя.
Этот фильтр, если он установлен, выполняется после того как переданы команды MAIL FROM и все RCPT TO, непосредственно перед тем, как отправитель начнёт передачу сообщения электронной почты. Обратите внимание, что на этом этапе отправитель уже отправил команду DATA, это единственный способ узнать, что команд RCPT TO больше не будет, но мы ещё не ответили на эту команду, поэтому фактически передача данных ещё не началась.
Этот фильтр, если он установлен, выполняется после того, как сервер SMTP получил всё сообщение целиком, но до того как он поместил его в локальный почтовый ящик или в очередь на отправку.
На каждом этапе фильтр возвращает код завершения, указывающий, должна ли обработка продолжаться в обычном режиме или следует сообщить отправителю через ответ об ошибке что почта отклонена.
Фильтры этапов 2-4 могут изменить список получателей. Фильтр этапа 4 может проверить файл сообщения, скопировать его или изменить его содержимое, а затем вернуть код ответа указывающий, должно ли сообщение быть доставлено.
Фильтрам передаётся аргумент - имя текстового файла содержащего информацию об отправителе и получателях в следующем формате:
Строка 1. Адрес IP клиента, пробел, имя хоста клиента:
[nnn.nnn.nnn.nnn] hostname
Если имя хоста невозможно определить из обратной записи DNS, то hostname просто повторяет адрес IP.
Строка 2. Имя хоста как оно представлено в команде HELO/EHLO.
Строка 3. Адрес отправителя как он представлен в команде MAIL FROM.
Строка 4. Пустая строка.
Остальные строки - адреса получателей как они представлены в командах RCTP TO.
На этапе 0 файл содержит только первую строку. На этапе 1 есть строки 1 и 2. На этапе 2 есть строки с 1 по 3. На этапах 3 и 4 файл содержит полную информацию. На этапе 4 фильтру передаётся второй аргумент - имя файла в котором записано полученное сообщение.
Имя файла передаваемое фильтрам в качестве первого аргумента после
"." содержит идентификатор сессии - строка из нескольких символов,
которая следует после SMTP.SRV
в
лог-файле.
Фильтр должен завершать работу с одним из следующих кодов:
0
Продолжать обрабатывать сообщение как
обычно. Этот код может возвращаться фильтром любого этапа.
1
Перестроить список получателей из файла
имя которого передано в качестве первого аргумента, так как фильтр
изменил его, затем продолжить обработку сообщения в обычном режиме.
Адрес отправителя также обновляется из строки 3. Строки 1 и 2
игнорируются. Этот код ответа имеет смысл только на этапах 2, 3 и
4.
2
Не доставлять сообщение и вернуть код
успешной обработки 250 2.6.0 OK
.
Этот код имеет смысл только на этапе 4.
3
Не доставлять сообщение. Возвратить
клиенту сообщение по-умолчанию об отклонении и завершить соединение.
На этапах 0, 1 и 2 сообщение об отклонении по умолчанию
421 4.7.0 Spammers not welcome
here
, на этапах 3 и 4: 554 5.7.1
Mail rejected by filter
.
4
Не доставлять сообщение, вернуть ответ
который записан в первой строке файла имя которого передано фильтру
в качестве первого аргумента и завершить соединение. Предполагается
что фильтр запишет ответ SMTP начинающийся с трёхзначного числового
кода в файл. Остальная часть файла может быть повреждена этой
записью, т.к. она не используется.
16
Тоже самое что 0
,
только фильтры остальных этапов для данного сообщения запускаться не
будут. Этот код ответа позволяет экономить ресурсы на запуск
фильтров если принято окончательное решение что сообщение должно
быть доставлено.
Любой другой код ответа будет обрабатываться как
0
с записью в журнале об ошибке фильтра.