Helpers
Пред. | Глава 4. Модули. | След.

## Helpers

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

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

    sessionId EVENT DATA

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

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

``sessionId` NEW` {`Flags`}

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

RELAY

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

TRUSTED

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

SUBMISSION

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

Формат ответа: `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|DIGEST-MD5}. Например: механизм CRAM-MD5 при нешифрованном соединении: `CRAM-MD5`, простой пароль с шифрованием соединения: `SSL/PLAIN`

User

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

Result

  Результат аутентификации:

  - `Success`

  - `The user is disabled`

  - `Error` (общая ошибка работы механизма аутентификации)

  - `Unsupported mechanism for this user` (попытка аутентификации с использованием CRAM-MD5/DIGEST-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`.

Пример 4.1. Работа хелпера с сессией SMTP.

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

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

Пред. | Наверх | След.
AB | Начало | Sieve