Модуль прослушивает различные события сервера SMTP и передаёт их в виде отдельных текстовых строк определённого формата на стандартный ввод программам хэлперам. Программа принимает решение о том какая реакция должна быть на полученное событие и записывает соответствующий ответ в виде текстовой строки определённого формата на стандартный вывод. После этого программа переходит к ожиданию следующего события - чтению строк из стандартного ввода.
События поступающие на стандартный ввод хелпера в общем виде имею формат:
sessionId EVENT DATA
где: sessionId
- уникальный идентификатор
сессии SMTP, строка из нескольких символов, которая следует после
SMTP.SRV
в лог-файле;
EVENT
- тип события; DATA
-
данные, зависят от типа события.
{sessionId
}NEW
{Flags
}
Начало новой сессии. Flags - список флагов разделённых пробелами:
Клиент является сервером пересылающим сообщения нам (релей).
Клиент является доверенным.
Клиент подключился к порту на котором запрещена авторизация.
Формат ответа: flag1,flag2,...
или flag1,flag2,...:text
, где
flagN:
Продолжить обычную работу.
Отправить клиенту альтернативное приветствие протокола
SMTP
. Приветствие
должно начинаться с числового кода 220 и пробела.
Закрыть соединение.
Установить для клиента флаг "доверенный".
Установить для клиента флаг "авторизованный".
{sessionId
}DESTROY
Завершение сессии. Соединение закрывается. Единственный
предполагаемый ответ - CONTINUE
.
{sessionId
}COMMAND
{SMTP command
}
От клиента получена команда протокола SMTP
.
Формат ответа: flag1,flag2,...
или flag1,flag2,...:text
, где
flagN:
Продолжить обычную работу.
Заменить команду другой.
Послать клиенту ответ протокола SMTP
, должен начинаться с
трёхзначного числового кода. Рассматривается как выполнение
команды хелпером.
Закрыть соединение.
Установить для клиента флаг "доверенный".
Установить для клиента флаг "авторизованный".
{sessionId
}AUTH
{Mechanism
} {User
} {Result
}
Выполнена процедура авторизации. Данные события:
Использовавшийся механизм, строка вида
[SSL/]{PLAIN|LOGIN|CRAM-MD5}. Например: механизм CRAM-MD5 при
нешифрованном соединении:
CRAM-MD5
, простой пароль с
шифрованием соединения:
SSL/PLAIN
Запрошенное имя пользователя.
Результат авторизации:
Success
The user is
disabled
Error
(общая ошибка
работы механизма авторизации)
Unsupported mechanism for this
user
(попытка авторизации с использованием
CRAM-MD5, но пароль пользователя хранится в виде
хэша)
Login failed
Формат ответа: flag1,flag2,...
или flag1,flag2,...:text
, где
flagN:
Продолжить обычную работу.
Установить для клиента флаг "доверенный".
Установить для клиента флаг "авторизованный".
{sessionId
}MAILFROM
{e-mail
}
Получена и синтаксически разобрана команда MAIL FROM, сервер готов принять этот адрес.
Формат ответа: flag1,flag2,...
или flag1,flag2,...:text
, где
flagN:
Продолжить обычную работу.
Послать клиенту ответ протокола SMTP
, должен начинаться с
трёхзначного числового кода. Рассматривается как сообщение об
ошибке, команда клиента MAIL не принимается.
Закрыть соединение.
Установить для клиента флаг "доверенный".
Установить для клиента флаг "авторизованный".
{sessionId
}DATA
Начало передачи сообщения.
Формат ответа: flag1,flag2,...
или flag1,flag2,...:text
, где
flagN:
Продолжить обычную работу.
Послать клиенту ответ протокола SMTP
, должен начинаться с
трёхзначного числового кода. Рассматривается как сообщение об
ошибке, команда клиента DATA не принимается.
Закрыть соединение.
Установить для клиента флаг "доверенный".
Установить для клиента флаг "авторизованный".
{sessionId
}DATAEND
{file
}
Сообщение полностью получено. Фильтр может изменить его.
Формат ответа: flag1,flag2,...
или flag1,flag2,...:text
, где
flagN:
Продолжить обычную работу.
Послать клиенту ответ протокола SMTP
, должен начинаться с
трёхзначного числового кода. Рассматривается как сообщение об
ошибке, сообщение электронной почты не принимается.
Закрыть соединение.
Установить для клиента флаг "доверенный".
Установить для клиента флаг "авторизованный".
{sessionId
}HDRFLD
[field: value
]
Получено поле заголовка сообщения, в этом случае оно указано в данных в виде "имя: значение", если данных нет, это означает что получен признак конца заголовка.
Ответ: {CONTINUE|REPLACE|INSAFTER|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
В реальной работе до завершения одной сессии могут приходить события другой (с другим уникальным идентификатором), если это не запрещено конфигурацией.