Событие отправлено или получено электронное письмо с надстройкой Oulook

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

Решение. В надстройке Outlook есть событие ItemAdd, которое получает объект MailItem. Затем он связывает настраиваемый GUID с объектом почтового элемента и сохраняет его. Затем он вызывает веб-службу с этими параметрами и идентификатором входа в папку.

Проблема: когда веб-служба переходит на сервер обмена, электронное письмо не обнаруживается, так как оно все еще отправляется. Проблема здесь в сроках, которые могут зависеть от различных факторов, таких как размер электронной почты, размер вложений, скорость Интернета и т. Д. Итак, есть ли в Outlook какое-либо событие, которое может быть инициировано, когда электронное письмо фактически «ОТПРАВЛЕНО», так что добавление- Затем in вызовет веб-службу.


person Naupad Doshi    schedule 11.10.2017    source источник
comment
Я считаю, что вы могли бы сделать это с помощью двухэтапной обработки: в обработчике ItemAdd добавьте второй обработчик к событию MailItem.Send и поместите свой вызов в веб-сервис в последнем.   -  person VBobCat    schedule 11.10.2017


Ответы (1)


Этого и следовало ожидать - когда Outlook отправляет сообщение, он выгружает его на сервер Exchange и перемещает в (локальную) папку «Отправленные», что вызывает событие Items.ItemAdd. Однако не гарантируется, что сообщение будет в серверной (сетевой) версии папки «Отправленные» - это произойдет (намного) позже, когда сервер отправит его. Обычно это занимает несколько секунд.

Либо введите задержку при отправке идентификатора записи сообщения на ваш веб-сервер, либо обработайте событие ItemAdd в онлайн-версии папки «Отправленные». Вы можете сделать это с помощью расширенного MAPI (C ++ или Delphi), открыв папку в онлайн-режиме (IMsgStore :: OpenEntry (..., MAPI_NO_CACHE), а затем обработав события IMAPITable из таблицы содержимого папки, возвращаемой IMAPIFolder :: GetContentsTable) или используйте Redemption, чтобы повторно открыть папку в онлайн-режиме - вызовите RDOSession .GetFolderFromID(..., MAPI_NO_CACHE).

person Dmitry Streblechenko    schedule 11.10.2017