2017-02-17 11 views
0

В настоящее время я пишу в Outlook VSTO AddIn. Используя этот AddIn, я хотел бы отслеживать разговоры по электронной почте и иметь возможность однозначно идентифицировать почтовые сообщения. Мы используем Exchange как MTA.Получить MessageID отправленной почты в Outlook

Для всех писем в папке «Входящие» (и во многих других папках) я могу использовать идентификатор сообщения из заголовка почты, чтобы выполнить сопоставление, но письма, лежащие в папке «Отправленные», не имеют идентификатора сообщения.

Есть ли способ получить идентификаторы сообщений с этих писем?

(Я думаю, что письма не имеют заголовка, поскольку они помещаются в папку перед отправкой, но после отправки почты MTA выдает сообщение с кодом состояния 250, который содержит идентификатор сообщения.) Outlook знает или каким-то образом сохраняет MessageID? Как Outlook отслеживает разговоры, если он не знает MessageID? Есть ли другой способ идентифицировать почту?

ответ

1

Прежде всего, давайте выясним, почему вы имеете в виду

Есть еще один способ определить почту

На самом деле вы можете продублировать по электронной почте, то они будут иметь один и тот же MessageID, но разные ItemId , Если у вас несколько получателей: [email protected], [email protected], [email protected] у них будет то же самое MessageID (aka InternetMessageId), даже первый из них даже не Exchange. Для двух других есть два разных сообщения на одном сервере Exchange. Имеются отличия ItemID (aka EntryId).

Заключение MessageID идентифицирует почту из своего содержимого и задается почтовым сервером, отправляющим электронное письмо. Насколько я знаю, нет альтернативы (кроме создания собственного «дайджест») из неизменяемых свойств электронной почты. Имейте в виду, что «ItemId» изменяется при перемещении электронной почты из папки в другую. See

Для VSTO надстройки вы можете получить MessageID ака InternetMessageId с помощью Redemption. Другой альтернативой является запрос ExchangeServer с использованием MAPI или EWS. Во всех случаях будет «вызов сервера», и он не может быть получен непосредственно после отправки, поскольку это свойство задается сервером Exchange Mail.

+0

Спасибо за ваш ответ. В основном мне нужен MessageID.Я получаю сообщение AddItem, когда новый почтовый элемент помещается в Отправленную папку. Этот объект является «Outlook.MailItem», используя этот код, я хотел бы получить соответствующий MessageID. Использование MAP или EWS было бы возможно, если EWS является предпочтительным методом. У вас есть дополнительная информация о том, как это сделать? – TomS

+0

Я думаю, что более простой подход - это OutlookRedemption. Когда у меня была подобная проблема, это был путь, который я взял. Для EWS см. Https://blogs.msdn.microsoft.com/brijs/2009/02/06/how-to-do-finditem-and-getitem-operations-of-exchange-web-services-using-vb-net/ –

+0

Пожалуйста, рассмотрите вопрос о ответе, как принято. –

0

Exchange всегда назначает идентификаторы сообщений всем существующим электронным письмам, даже если они не отправлены. Проблема заключается в том, что идентификатор не может быть видимым в кэшированном режиме, поскольку поставщик MSEMS пытается минимизировать сетевой трафик и не синхронизирует данные из папки «Отправленные», поскольку в кеш-хранилище имеется «почти» одна и та же копия.

Вы можете снова открыть сообщение из папки Отправленной в режиме онлайн, указав MAPI_NO_CACHE флаг (0x0200) при вызове IMsgStore::OpenEntry, а затем чтения свойства PR_INTERNET_MESSAGE_ID (0x1035001F).

Если расширенный MAPI не является вариантом (его можно использовать только с C++ или Delphi), вы можете использовать Redemption и его RDOSession. GetMessageFromID, который позволяет (необязательно) указывать флаги:

set YourMailItem = Application.ActiveExplorer.Selection(1) 

MAPI_NO_CACHE = &H0209 
MAPI_BEST_ACCESS = &H0010 

set Session = CreateObject("Redemption.RDOSession") 
Session.MAPIOBJECT = Application.Session.MAPIOBJECT 
set Mail = Session.GetMessageFromID(YourMailItem.EntryID, , MAPI_NO_CACHE + MAPI_BEST_ACCESS) 
MsgBox Mail.Fields("http://schemas.microsoft.com/mapi/proptag/0x1035001F")