Helpers.

Модуль прослушивает различные события сервера SMTP и передаёт их в виде отдельных текстовых строк определённого формата на стандартный ввод программам хэлперам. Программа принимает решение о том какая реакция должна быть на полученное событие и записывает соответствующий ответ в виде текстовой строки определённого формата на стандартный вывод. После этого программа переходит к ожиданию следующего события - чтению строк из стандартного ввода.

События поступающие на стандартный ввод хелпера в общем виде имею формат:

sessionId EVENT DATA

где: sessionId - уникальный идентификатор сессии SMTP, строка из нескольких символов, которая следует после SMTP.SRV в лог-файле; EVENT - тип события; DATA - данные, зависят от типа события.

Справочник событий.

{sessionId}NEW {Flags}

Начало новой сессии. Flags - список флагов разделённых пробелами:

RELAY

Клиент является сервером пересылающим сообщения нам (релей).

TRUSTED

Клиент является доверенным.

NOAUTH

Клиент подключился к порту на котором запрещена авторизация.

Формат ответа: flag1,flag2,... или flag1,flag2,...:text, где flagN:

CONTINUE

Продолжить обычную работу.

REPLY:<SMTP greeting>

Отправить клиенту альтернативное приветствие протокола SMTP. Приветствие должно начинаться с числового кода 220 и пробела.

CLOSE

Закрыть соединение.

TRUSTED

Установить для клиента флаг "доверенный".

AUTH

Установить для клиента флаг "авторизованный".

{sessionId}DESTROY

Завершение сессии. Соединение закрывается. Единственный предполагаемый ответ - CONTINUE.

{sessionId}COMMAND {SMTP command}

От клиента получена команда протокола SMTP.

Формат ответа: flag1,flag2,... или flag1,flag2,...:text, где flagN:

CONTINUE

Продолжить обычную работу.

REPLACE:<SMTP command>

Заменить команду другой.

REPLY:<SMTP response>

Послать клиенту ответ протокола SMTP, должен начинаться с трёхзначного числового кода. Рассматривается как выполнение команды хелпером.

CLOSE

Закрыть соединение.

TRUSTED

Установить для клиента флаг "доверенный".

AUTH

Установить для клиента флаг "авторизованный".

{sessionId}AUTH {Mechanism} {User} {Result}

Выполнена процедура авторизации. Данные события:

Mechanism

Использовавшийся механизм, строка вида [SSL/]{PLAIN|LOGIN|CRAM-MD5}. Например: механизм CRAM-MD5 при нешифрованном соединении: CRAM-MD5, простой пароль с шифрованием соединения: SSL/PLAIN

User

Запрошенное имя пользователя.

Result

Результат авторизации:

  • Success

  • The user is disabled

  • Error (общая ошибка работы механизма авторизации)

  • Unsupported mechanism for this user (попытка авторизации с использованием CRAM-MD5, но пароль пользователя хранится в виде хэша)

  • Login failed

Формат ответа: flag1,flag2,... или flag1,flag2,...:text, где flagN:

CONTINUE

Продолжить обычную работу.

TRUSTED

Установить для клиента флаг "доверенный".

AUTH

Установить для клиента флаг "авторизованный".

{sessionId}MAILFROM {e-mail}

Получена и синтаксически разобрана команда MAIL FROM, сервер готов принять этот адрес.

Формат ответа: flag1,flag2,... или flag1,flag2,...:text, где flagN:

CONTINUE

Продолжить обычную работу.

REPLY:<SMTP response>

Послать клиенту ответ протокола SMTP, должен начинаться с трёхзначного числового кода. Рассматривается как сообщение об ошибке, команда клиента MAIL не принимается.

CLOSE

Закрыть соединение.

TRUSTED

Установить для клиента флаг "доверенный".

AUTH

Установить для клиента флаг "авторизованный".

{sessionId}DATA

Начало передачи сообщения.

Формат ответа: flag1,flag2,... или flag1,flag2,...:text, где flagN:

CONTINUE

Продолжить обычную работу.

REPLY:<SMTP response>

Послать клиенту ответ протокола SMTP, должен начинаться с трёхзначного числового кода. Рассматривается как сообщение об ошибке, команда клиента DATA не принимается.

CLOSE

Закрыть соединение.

TRUSTED

Установить для клиента флаг "доверенный".

AUTH

Установить для клиента флаг "авторизованный".

{sessionId}DATAEND {file}

Сообщение полностью получено. Фильтр может изменить его.

Формат ответа: flag1,flag2,... или flag1,flag2,...:text, где flagN:

CONTINUE

Продолжить обычную работу.

REPLY:<SMTP response>

Послать клиенту ответ протокола SMTP, должен начинаться с трёхзначного числового кода. Рассматривается как сообщение об ошибке, сообщение электронной почты не принимается.

CLOSE

Закрыть соединение.

TRUSTED

Установить для клиента флаг "доверенный".

AUTH

Установить для клиента флаг "авторизованный".

{sessionId}HDRFLD [field: value]

Получено поле заголовка сообщения, в этом случае оно указано в данных в виде "имя: значение", если данных нет, это означает что получен признак конца заголовка.

Ответ: {CONTINUE|REPLACE|INSAFTER|INSBEFORE}[:Field: value]

CONTINUE

Продолжить обычную работу.

REPLACE:Field: Value

Заменить поле на другое. Если это ответ на событие получения конца заголовка - новое поле будет добавлено к заголовку.

INSAFTER:Field: Value

Вставить поле в заголовок после полученного. Если это ответ на событие получения конца заголовка - новое поле будет добавлено к заголовку.

INSBEFORE:Field: Value

Вставить поле в заголовок перед полученным. Если это ответ на событие получения конца заголовка - новое поле будет добавлено к заголовку.

Пример сессии.

Ниже приводятся события получаемые хелпером от начала сессии SMTP до конца. Строки событий записываемые на стандартный ввод хелпера начинаются с E: , этот префикc не является частью события и приводится для наглядности. Строки ответов хелпера записываемые на стандартный вывод начинаются с R: , этот префикс не является частью ответа. Подразумевается что уникальный идентификатор сессии a1b2. В примере хелпер заменяет стандартное приветствие протокола и добавляет новое поле заголовка Priority: urgent.

E: a1b2 NEW TRUSTED SSL
R: REPLY:220 bar.com ESMTP Manjary. Hello, we trust you.
E: a1b2 COMMAND EHLO [192.168.1.20]
R: CONTINUE
E: a1b2 COMMAND MAIL FROM:<Smith@bar.com> SIZE=5883
R: CONTINUE
E: a1b2 MAILFROM Smith@bar.com
R: CONTINUE
E: a1b2 COMMAND RCPT TO:<Jones@foo.com>
R: CONTINUE
E: a1b2 COMMAND DATA
R: CONTINUE
E: a1b2 DATA
R: CONTINUE
E: a1b2 HDRFLD Date: Sat, 24 May 2023 20:34:51 +1100
R: CONTINUE
E: a1b2 HDRFLD From: Smith <Smith@bar.com>
R: CONTINUE
E: a1b2 HDRFLD To: Jones <Jones@foo.com>
R: CONTINUE
E: a1b2 HDRFLD Subject: The Next Meeting of the Board
R: CONTINUE
E: a1b2 HDRFLD
R: INSAFTER:Priority: urgent
E: a1b2 COMMAND .
R: CONTINUE
E: a1b2 DATAEND D:\Mail\#queue\V5U1N0.eml
R: CONTINUE
E: a1b2 COMMAND QUIT
R: CONTINUE
E: a1b2 DESTROY
R: CONTINUE

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