Как получить доступ к определенной электронной почте с сервера обмена EWS - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь получить конкретное письмо от EWS, используя C #, но не смог найти способ идентифицировать конкретное письмо.

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
            service.Credentials = new WebCredentials(myemail, password);
            service.UseDefaultCredentials = false;
            service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
            ItemView itemsView = new ItemView(5);
            string querystring = "Kind:email";                

            FindItemsResults<Item> itemResults = service.FindItems(WellKnownFolderName.Inbox, querystring, view: itemsView);

Метод FindItems выдает электронные письма на основе строки запроса.Я сохраняю EmailMessage.InternetMessageId и EmailMessage.Id и подробности о предмете в моей базе данных.В моем случае у меня могут быть электронные письма с темой и немного другим содержанием тела.

Позже, основываясь на действиях пользователя, я хочу получить конкретную электронную почту с сервера обмена.Могу ли я использовать какой-либо метод и получать электронную почту на основе EmailMessage.InternetMessageId или EmailMessage.Id?Эти идентификаторы надежны?Я не мог найти метод в документах.В настоящее время я думаю о том, чтобы прочитать электронные письма по теме, а затем отфильтровать результаты по EmailMessage.Id.UniqueId

Есть ли какой-нибудь хороший альтернативный способ получения конкретной почты с сервера обмена?

1 Ответ

1 голос
/ 25 апреля 2019

IntenetMessageId должен быть уникальным, но нет гарантии, что это произойдет из-за количества различных процессов, которые могут устанавливать идентификаторы.

Если вы хотите получить конкретное сообщение на основе его InternetMessageId, вам нужно использовать свойство Extended, а не строго типизированное, например,

  String MessageID = "<blah@1223434556com">"
  ItemView ivew = new ItemView(3);
  service.TraceEnabled = true;
  ExtendedPropertyDefinition PidTagInternetMessageId = new ExtendedPropertyDefinition(4149, MapiPropertyType.String);
  SearchFilter sf = new SearchFilter.IsEqualTo(PidTagInternetMessageId, MessageID);
  FindItemsResults<Item> iCol = service.FindItems(WellKnownFolderName.Inbox, sf, ivew);

  foreach (Item item in iCol.Items)
  {
    Console.WriteLine(item.Subject);
  }

. Вы можете экспортировать сообщение в EML.файл с использованием https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-export-items-by-using-ews-in-exchange

...