Email-сообщения. Работа с цепочками писем
Glossary Item Box
Общие сведения
Начиная с версии 7.10.0 в приложении добавлен механизм формирования цепочек Email-сообщений. Целью данного решения является возможность улучшить пользовательский интерфейс работы с Email-сообщениями. Также использование этого механизма позволит упростить поиск связей для писем, например, копированием связей предыдущего письма.
Разработанный механизм построения цепочек опирается на данные из заголовков Email-сообщений In-Reply-To. В этом заголовке по общепринятым соглашениям должен содержаться идентификатор письма Message-ID, на который отвечает текущее письмо. Приложение Creatio получает эти заголовки из Email-сервиса, с которым настроена синхронизация (IMAP/Exchange).
Условно механизм работы с цепочками можно поделить на две логические части — создание цепочки и заполнение связей активности.
Создание цепочек Email-сообщений
В детали EmailMessageData добавлены три поля, отвечающие за цепочки Email-сообщений:
- MessageId — строка длиной 500 символов;
- InReplyTo — строка длиной 500 символов;
- ParentMessageId — справочное поле, ссылающееся на деталь EmailMessageData.
При синхронизации писем поля MessageId и InReplyTo заполняются соответствующими значениями из заголовков письма.
Поле ParentMessageId заполняется следующим образом:
- В таблице EmailMessageData выполняется поиск записей, у которых MessageId равен текущему InReplyTo. Если записи найдены, первая из них устанавливается как текущий ParentMessageId.
- Во всех записях EmailMessageData, у которых InReplyTo равен текущему MessageId и поле ParentMessageId не заполнено, полю ParentMessageId присваивается значение, равное текущему Id.
Таким образом, для каждого письма актуализируются связи с соседними письмами в цепочках.
Копирование связей предыдущего письма в цепочке
После добавления письма необходимо распространить связи активности по цепочке. Этот процесс будет рассмотрен на примере поля [Обращение].
Для текущей записи EmailMessageData выполняется поиск такой родительской записи, у которой указана активность с заполненным полем [Обращение]. Значение поля [Обращение] из этой активности будет распространятся по цепочке. Начиная с найденной записи EmailMessageData выполняется поиск всех дочерних записей EmailMessageData и обновляется значение поля [Обращение] в найденных активностях.
Например, существует цепочка из трех Email-сообщений:
ActivityId | Title | CaseId | EmailMessageId | EmailMessageParentId |
---|---|---|---|---|
28BD6D59-B9D7-4FF9-89F5-FEE1DD003912 | Re: relation | NULL | 66812FBF-411B-4FE0-94C9-1E70FBBEB2D3 | F05B529D-C98C-4E26-BE00-21F8721AEF58 |
DC0A40D4-700A-40EB-B394-90E0376C3B5D | Re: relation | 1C6E18E3-48B1-495E-8EF9-ACA35DB9DE0B | F05B529D-C98C-4E26-BE00-21F8721AEF58 | E1A0120E-B7C0-4261-9DE0-C63341BF1E0B |
D7A9B82C-ED46-437C-980A-B2650D4FF3DA | relation | 906909E8-4D64-47FD-AF92-B65B0826AEC3 | E1A0120E-B7C0-4261-9DE0-C63341BF1E0B | NULL |
Затем в цепочку приходит еще одно Email-сообщение:
ActivityId | Title | CaseId | EmailMessageId | EmailMessageParentId |
---|---|---|---|---|
6623B052-73AD-4AE5-AE61-A6F9BCD930A0 | Re: relation | NULL | 60C00B01-D0BF-40F6-923E-1830E433AEA1 | 66812FBF-411B-4FE0-94C9-1E70FBBEB2D3 |
28BD6D59-B9D7-4FF9-89F5-FEE1DD003912 | Re: relation | NULL | 66812FBF-411B-4FE0-94C9-1E70FBBEB2D3 | F05B529D-C98C-4E26-BE00-21F8721AEF58 |
DC0A40D4-700A-40EB-B394-90E0376C3B5D | Re: relation | 1C6E18E3-48B1-495E-8EF9-ACA35DB9DE0B | F05B529D-C98C-4E26-BE00-21F8721AEF58 | E1A0120E-B7C0-4261-9DE0-C63341BF1E0B |
D7A9B82C-ED46-437C-980A-B2650D4FF3DA | relation | 906909E8-4D64-47FD-AF92-B65B0826AEC3 | E1A0120E-B7C0-4261-9DE0-C63341BF1E0B | NULL |
Начиная с записи, у которой EmailMessageId = "60C00B01-D0BF-40F6-923E-1830E433AEA1" выполняется поиск записи, у которой колонка CaseId заполнена (не содержит NULL). Это запись, у которой EmailMessageId = "F05B529D-C98C-4E26-BE00-21F8721AEF58", а CaseId = "1C6E18E3-48B1-495E-8EF9-ACA35DB9DE0B".
Теперь начиная с записи, у которой EmailMessageId = "F05B529D-C98C-4E26-BE00-21F8721AEF58", необходимо обновить значение поля CaseId для дочерних записей по всей цепочке.
ActivityId | Title | CaseId | EmailMessageId | EmailMessageParentId |
---|---|---|---|---|
6623B052-73AD-4AE5-AE61-A6F9BCD930A0 | Re: relation | 1C6E18E3-48B1-495E-8EF9-ACA35DB9DE0B | 60C00B01-D0BF-40F6-923E-1830E433AEA1 | 66812FBF-411B-4FE0-94C9-1E70FBBEB2D3 |
28BD6D59-B9D7-4FF9-89F5-FEE1DD003912 | Re: relation | 1C6E18E3-48B1-495E-8EF9-ACA35DB9DE0B | 66812FBF-411B-4FE0-94C9-1E70FBBEB2D3 | F05B529D-C98C-4E26-BE00-21F8721AEF58 |
DC0A40D4-700A-40EB-B394-90E0376C3B5D | Re: relation | 1C6E18E3-48B1-495E-8EF9-ACA35DB9DE0B | F05B529D-C98C-4E26-BE00-21F8721AEF58 | E1A0120E-B7C0-4261-9DE0-C63341BF1E0B |
D7A9B82C-ED46-437C-980A-B2650D4FF3DA | relation | 906909E8-4D64-47FD-AF92-B65B0826AEC3 | E1A0120E-B7C0-4261-9DE0-C63341BF1E0B | NULL |
Сложности данного механизма обусловлены тем, что очень часто почтовый сервер отдает письма не в той последовательности, в которой они были написаны в цепочке.
Самый простой и частый пример — в ходе сессии синхронизации сначала приходит почта из папки "Входящие", а затем — из папки "Исходящие". Если же письма были получены не последовательно, то не будет возможности построить цепочку на момент загрузки каждого письма. Но такая возможность появляется к завершению цикла синхронизации всех писем почтового ящика. Безусловно, логика поиска цепочек может не сработать, если настроена загрузка не всех папок почтового ящика, или цепочка была прервана другими участниками переписки. Тем не менее, в большом количестве случаев цепочку можно построить на момент завершения загрузки всех писем из почтового ящика.
Рекомендации по добавлению пользовательского процесса поиска всех связей в цепочках после загрузки Email-сообщения
Для того чтобы начать работу по новому полученному Email-сообщению после завершения формирования цепочек, необходимо знать следующее:
- В таблице EmailMessageData появляется поле Id сессии синхронизации, уникальное для одного запуска процесса синхронизации. Заполняется только для синхронизированных Email-сообщений.
- Появляется таблица FinishedSyncSession, в которую добавляется запись, если в рамках синхронизации пришло хоть одно Email-сообщение.
- Процессы, ранее слушавшие сигнал сохранения активности, в новой реализации слушают сигнал добавления (Inserted) объекта FinishedSyncSession. По значению Id сессии синхронизации выбираются Email-сообщения из EmailMessageData. Также в EmailMessageData существует поле MailboxSyncSettings, которое можно использовать для отбора Email-сообщений из сервисного ящика.