Синхронизация почты с MS Exchange
Glossary Item Box
Общее описание
На базе механизма синхронизации Sync Engine в конфигурации реализована синхронизация с различными сущностями MS Exchange по протоколу EWS (Exchange Web Services). В данной статье описан процесс синхронизации почты из MS Exchange. В отличие от общего механизма синхронизации, почта синхронизируется только из MS Exchange в bpm'online. В силу того что письма после отправки уже не могут быть изменены, в синхронизации участвуют только ранее не синхронизированные письма. Основным отличием механизма синхронизации почты от других интеграций является механизм поиска письма в bpm'online. Так как одно и то же письмо может быть синхронизировано от имени любого из получателей, и даже по протоколу IMAP, то для поиска ранее синхронизированных писем нельзя использовать метаданные синхронизации. Для поиска письма используется тема, дата отправки и тело письма. Из тела письма удаляется разметка и пробельные символы. Для ускорения поиска используется md5 хэш, который хранится в колонке MailHash объекта Activity.
Вторым отличием данной синхронизации является то, что деталь вложения синхронизируется отдельным процессом, после того как обработаны все письма. Это сделано для того, чтобы время на скачивание вложения не влияло на время сохранения писем.
Классы, реализующие интеграцию
Как описано в статье "Синхронизация bpm'online с внешними хранилищами данных", для того чтобы реализовать интеграцию с использованием данного механизма, необходим класс, реализующий логику работы с внешним хранилищем (наследник RemoteProvider) и класс, реализующий интерфейс IRemoteItem, который представляет один экземпляр элемента синхронизации (в нашем случае — email MS Exchange).
Рис. 1. — Схема иерархии RemoteProvider
Класс ExchangeEmailSyncProvider является провайдером для работы с внешним хранилищем exchange, в нем реализована логика по выбору данных из MS Exchange.
Класс ExchangeEmailMessage реализует интерфейс IRemoteItem и в нем реализована логика заполнения данных в объектах bpm'online.
Класс ExchangeUtility содержит утилитные методы для использования библиотеки EWS API и методы, используемые для загрузки вложений писем.
Класс ExchangeEmailMessageUtility содержит утилитные методы для преобразования справочных значений из полей email.
Рис. 2. — Схема иерархии RemoteItem
Синхронизируемые данные
Соответствие объектов bpm'online и полей класса EmailMessage MS Exchange отображено в таблице 1.
Табл. 1. — Соответствие объектов bpm'online и полей класса EmailMessage MS Exchange
Объект bpm'online | Поле объекта | Соответствующее поле EmailMessage |
---|---|---|
Activity | Title | Subject |
Body | Body.Text | |
Sender | Sender | |
Recepient | ToRecepients | |
CopyRecepient | CcRecepients | |
BlindCopyRecepient | BccRecepients | |
SendDate | DateTimeSpent | |
Priority | Importance | |
DueDate, StartDate | DateTimeReceived | |
ActivityFile | Name | Name |
Data | Content | |
Size |
Content.Length |
Логика заполнения участников письма
Для того чтобы письмо правильно отображалось только у пользователей, которые его синхронизировали, реализован следующий механизм заполнения детали [Участники активности]. Условно эту логику можно разделить на две части:
- Создание участников для нового письма.
- Актуализация списка участников при его изменении (в том числе, повторной синхронизации).
Создание участников для нового письма
Основным значением, которое влияет на то, кто попадет в участники письма, является деталь [Средства связи] контакта. Если у контакта на детали [Средства связи] есть email, который указан в одном из адресных полей письма ([от], [кому], [копия], [скрытая копия]), то контакт может быть добавлен в участники. Дополнительно выполняется проверка, существует ли для этого контакта пользователь системы, не являющийся пользователем портала. Пользователь добавляется в участники только тогда, когда он синхронизирует это письмо. Это позволяет добавить в участники переписки всех внешних контактов, и только тех пользователей, которые синхронизировали это письмо.
Актуализация списка участников письма
Для того чтобы после синхронизации уже существующего письма пользователь попал в участники письма, при изменении письма происходит актуализация участников — все участники, которые не являются пользователями bpm'online, удаляются с детали, и затем выполняется алгоритм заполнения детали для нового письма. Таким образом, пользователи, которые ранее синхронизировали письмо, остаются в участниках, новый пользователь добавляется, а список контактов актуализируется.
Логика выбора данных для синхронизации
При выборе писем для синхронизации из папок MS Exchange используется следующий набор фильтров: выбрать письма, которые изменены после даты последней синхронизации почты, и не являются черновиками. Для папок синхронизации существует ограничение: папка "Удаленные" и папка "Конфликтующие элементы" не участвуют в синхронизации. При выборе писем не учитывается наличие метаданных синхронизации. Направление изменений всегда "сохранить изменения в bpm'online". При обработке каждого письма вначале проверяется наличие письма в bpm'online. Если письмо уже существует в bpm'online, выполняется обновление участников, если нет, то создается новое письмо. В конце сессии синхронизации в планировщик добавляется задание на синхронизацию вложений.