Почтовый шлюз (Mail Processing)
Почтовый шлюз - это компонент системы, отвечающий за отправку электронных писем (E-mail), связанных с обработкой заявок и выполнением рабочих процессов.
Функции почтового шлюза
- Управление очередью входящих и исходящих почтовых сообщений (SenderMessage)
- Отправка уведомлений о событиях
- Отправка исходящей почты из очереди сообщений
- Загрузка входящей почты в очередь сообщений
- Хранение правил обработки входящих сообщений (MailRule)
- Обработка входящих сообщений согласно настроенным правилам (MailProcessing)
Каналы E-mail сообщений (Mail Channel)
Каналы E-mail сообщений настраиваются администратором системы в разделе Администрирование (Admin).
Направление канала определяется по указанному протоколу:
- SMTP - канал исходящих сообщений;
- IMAP - канал входящих сообщений.
Атрибуты
- Наименование (Name) -
String- имя канала, выводимое в системе. Обязательный атрибут. - Протокол (Proto) -
ChannelProto- почтовый протокол. Возможные значения:- SMTP - канал исходящих сообщений;
- IMAP - канал входящих сообщений.
- Шифрование (Encryption) -
ChannelEncryption- шифрование. Возможные значения:- NONE;
- SSL;
- TLS.
- Тип аутентификации (Auth type) -
ChannelAuthType- тип аутентификации. Возможные значения:- NONE - аутентификация отсутствует;
- LOGIN - аутентификация по имени пользователя и паролю;
- Хост (Host) -
String- имя или IP-адрес почтового сервера. - Порт (Port) -
Integer- порт сервера. Заполняется автоматически или может быть указан вручную. Автоматическое заполнение в соответствии со значениями полей Протокол, Шифрование:- SMTP, NONE = 25;
- SMTP, SSL = 465;
- SMTP, TLS = 587;
- IMAP, NONE = 143;
- IMAP, SSL = 993;
- IMAP, TLS = 143.
- Адрес отправителя (Address) -
String- E-mail, который будет подставляться в заголовок From:. Указывается только для протокола SMTP (канал исходящих сообщений). - Имя пользователя (Username) -
String- Имя пользователя. - Пароль (Password) -
String- Пароль. Указывается для типа аутентификации LOGIN. - Рабочий процесс (Workflow) -
String- Идентификатор рабочего процесса. Выбирается из списка рабочих процессов. Обязателен для протокола IMAP. - Каталог IMAP (IMAP Folder)** -
String- Только для протокола IMAP. Наименование каталога IMAP. Обязательный атрибут. Значение по-умолчанию: INBOX. - Основной (Main) -
Boolean- Только для протокола SMTP. Канал помеченный как основной, будет использоваться для отправки уведомлений и сообщений, для которых не указан рабочий процесс. - Удалять полученные (Delete received) -
Boolean- Только для протокола IMAP. Признак указывает, что при получении сообщения оно должно быть удалено с сервера. - Отладка (Debug) -
Boolean- Включает вывод отладочной информации по каналу в логи системы. - Активно (Active) -
Boolean- Признак, что канал является активным.
Ключевые принципы
Регистрация каналов (Channel Service)
- При запуске система (ChannelService) получает список каналов, являющихся активными (active = true).
- Для каждого активного канала выполняется процедура его валидации.
- Если канал прошел валидацию, выполняется процедура его регистрации в памяти приложения.
- При изменении настроек каналов система автоматически обновляет их регистрацию в памяти приложения. Также, обновление выполняется в фоне, с периодичностью, указанной в конфигурационном параметре
sender.channel-init-delay-in-millis(по-умолчанию - каждую минуту).
Создание исходящего сообщения (Sender Message Factory)
- Компоненты системы и внешние сервисы создают в очереди сообщений (SenderMessage) сообщения для отправки (атрибут direction = OUTBOX).
- Выбирается канал для отправки. Если канал не удалось определить, используется канал, имеющий признак основного (main = true).
- Происходит заполнение поля Отправитель (From) по шаблону:
senderMessage.sender <channel@address>, где:- senderMessage.sender - имя отправителя, указанное в сообщении;
- channel@address - E-mail, указанный в настройках выбранного канала.
- Если поле senderMessage.sender пустое, то в поле Отправитель указывается значение из channel@address.
- Для сообщения устанавливается число попыток для отправки (атрибут retries), указанное в конфигурационном параметре
sender.retries(по-умолчанию = 3).
Отправка исходящего сообщения (Sender Service)
- Сервис отправки сообщений (SenderService) осуществляет проверку очереди сообщений (SenderMessage) с периодичностью, указанной в конфигурационном параметре
sender.send-delay-in-millis(по-умолчанию - каждую минуту). - Отбираются сообщения, имеющие значение атрибутов: retries (число повторов) > 0 и complete (признак обработанного сообщения) = false.
- Если отправка успешна, система устанавливает значение атрибутов: retries = 0, complete = false.
- Если отправка не успешна, система уменьшает значение атрибута retries на 1 и записывает stacktrace ошибки в поле exception.
Получение входящих сообщений (Receiver Service)
- Сервис получения сообщений (ReceiverService) получает список зарегистрированных каналов входящих сообщений с периодичностью, указанной в конфигурационном параметре
sender.receive-delay-in-millis(по-умолчанию - каждую минуту). - Для каждого из каналов выполняется подключение к серверу IMAP и получение сообщений.
- Полученные сообщения сохраняются в очередь сообщений (SenderMessage) с атрибутами:
- direction = INBOX;
- completed = false;
- raw = полученное сообщение в “сыром” формате.
- Если канал имеет атрибут deleteReceived = true, происходит удаление сообщения. Иначе - сообщение помечается как прочитанное.
Обработка входящих сообщений (Mail Processing)
После получения входящего сообщения и помещения его в очередь (SenderMessage), система выполняет его обработку по следующему алгоритму:
- Выбор сообщений для обработки
- Сервис обработки входящей почты (
MailProcessingService) периодически (интервал задаётся параметромsender.receive-delay-in-millis, по умолчанию — 1 минута) выбирает из очереди все сообщения:- с направлением
INBOX; - с
retries > 0; - с
completed = false.
- с направлением
Обработка сообщения
Для каждого выбранного сообщения выполняется метод
processMessage():
Проверка наличия номера заявки в теме письма
Если тема письма содержит номер заявки (в формате
[Ticket#XXXX]):- выполняется поиск заявки по номеру;
- если заявка найдена — создаётся комментарий с содержимым письма и вложениями;
- обработка завершается.
Проверка связи с существующим комментарием
Если в заголовках письма есть
In-Reply-ToилиReferences, указывающие наSenderMessageIdкомментария:- система находит комментарий и связанную заявку;
- создаётся комментарий с содержимым письма и вложениями;
- обработка завершается.
Создание новой заявки
Если ни заявка по номеру, ни связь с комментарием не найдены:
выполняется подбор правил обработки писем (
MailRule);активные правила сортируются по убыванию приоритета (
priority);по каждой категории (
OutputType):WORKFLOW— определяется рабочий процесс;TICKET_TYPE— тип заявки;SERVICE_ENTITY— сервис;- значения присваиваются новой заявке.
создаётся новая заявка:
- заголовок — тема письма (
subject); - содержание — тело письма (HTML или plain text);
- добавляются вложения;
- определяется отправитель — если он совпадает с персоной или организацией, заполняются соответствующие поля.
- заголовок — тема письма (
создаётся комментарий типа
INBOUNDс содержимым письма и вложениями.
- Результат обработки
При успешной обработке:
- сообщение помечается:
completed = true,retries = 0.
- сообщение помечается:
При ошибке обработки:
- значение
retriesуменьшается на 1; - в поле
exceptionсохраняется описание ошибки; - сообщение остаётся
completed = false.
- значение
- Повторные попытки
- Повторная обработка выполняется при следующих запусках задачи;
- сообщение будет обрабатываться, пока
retries > 0; - число попыток задаётся параметром
sender.retries(по умолчанию = 3).
Сопоставление правил (Mail Rule)
Для автоматической обработки входящих сообщений используется справочник правил (Mail Rule). Каждое правило определяет, как обрабатывать письмо в зависимости от его полей (адресов или темы).
Атрибуты правила:
RuleType — поле письма, к которому применяется правило:
TO— поле «Кому»;FROM— поле «От»;SUBJECT— тема письма.
RuleValue — регулярное выражение (regexp), применяемое к значению выбранного поля.
OutputType — тип объекта, к которому относится результат обработки:
WORKFLOW— рабочий процесс;SERVICE_ENTITY— сервис;TICKET_TYPE— тип заявки.
OutputValue — идентификатор объекта (UUID), к которому будет привязана новая заявка.
Priority — приоритет правила (чем выше — тем раньше применяется).
Active — активность правила.
Алгоритм применения правил:
- Все активные правила выбираются из справочника;
- Для каждого правила выполняется проверка
matchesRule():
- к выбранному полю письма применяется регулярное выражение;
- если найдено совпадение — правило считается сработавшим.
- Если сработало несколько правил:
- Для каждого OutputType (
WORKFLOW,TICKET_TYPE,SERVICE_ENTITY) выбирается правило с наивысшим приоритетом (priority).
- Применённые правила управляют полями создаваемой заявки.
Примеры использования правил:
| RuleType | RuleValue | OutputType | OutputValue (пример) | Priority |
|---|---|---|---|---|
| TO | support@reunico.com | WORKFLOW | 4e90609b-7b62-45a4-9e61-2e06b5322fc4 | 999 |
| FROM | mmartynyuk@reunico.com | SERVICE_ENTITY | 8b73b058-8940-4eee-a3ad-bc18b9d341c5 | 99 |
| SUBJECT | .Инцидент. | TICKET_TYPE | 2f7adbdc-2db2-4e22-8fcb-65fffd885877 | 500 |
Приоритет:
- Чем выше
priority, тем раньше применяется правило для данного OutputType; - Если несколько правил одного типа сработали — выбирается правило с наивысшим приоритетом.
Очередь сообщений (SenderMessage)
Очередь сообщений — это внутренний механизм хранения и обработки входящих и исходящих писем в системе.
Все E-mail сообщения (входящие и исходящие) записываются в очередь сообщений (таблица SenderMessage).
Очередь используется для:
- Асинхронной отправки исходящих писем;
- Приема и хранения входящих писем;
- Повторной отправки при ошибках;
- Хранения истории обработки сообщений;
- Связи сообщений с комментариями, заявками, событиями.
Атрибуты
| Атрибут | Тип данных | Описание |
|---|---|---|
| id | UUID | Уникальный идентификатор сообщения |
| subject | String | Тема письма |
| body | String | Тело письма (HTML или plain text) |
| raw | String (TEXT) | Сырые данные исходного письма (MIME) — только для входящих сообщений |
| recipients | Set<String> | Получатели письма (To:) |
| copy | Set<String> | Получатели копии (Cc:) |
| retries | Integer | Количество оставшихся попыток отправки (по умолчанию — 3) |
| exception | String | Текст последней ошибки (при неудачной отправке) |
| direction | SenderMessageDirection | Направление сообщения:OUTBOX — исходящееINBOX — входящее |
| channelName | String | Имя канала, через который отправлено или получено сообщение |
| sender | String | Адрес отправителя (From:) |
| completed | Boolean | Признак обработки сообщения:true — сообщение обработаноfalse — ожидает обработки или повторной попытки |
| messageId | String | RFC 5322 Message-ID (уникальный идентификатор письма в E-mail системе) |
| inReplyTo | String | RFC 5322 In-Reply-To (используется для связывания с предыдущими письмами/комментариями) |
| attachments | Set<UUID> | Идентификаторы вложений (Attachment), связанных с этим сообщением |
Жизненный цикл сообщения
| Этап | Описание |
|---|---|
| Создание исходящего сообщения | Записывается в очередь с direction = OUTBOX, completed = false |
| Попытка отправки | Проверяется сервисом SenderService. При успехе → completed = true, retries = 0 |
| Ошибка отправки | В случае ошибки уменьшается retries, фиксируется exception. При retries = 0 сообщение считается неотправленным |
| Получение входящего сообщения | Записывается в очередь с direction = INBOX, completed = false |
| Обработка входящего сообщения | При успешной обработке MailProcessingService → completed = true |
| Повторная попытка обработки входящего | При ошибке обработки → retries уменьшается, exception сохраняется |
Примечания
- Все входящие письма сохраняются в
rawвиде (полный MIME) для возможности повторной обработки. - Атрибут
attachmentsсодержит ссылки на файлы (Attachment), загруженные с письмом или прикрепленные к исходящему сообщению. - Связь с комментариями осуществляется по полю
messageId↔senderMessageIdв комментарии.