Как получить доступ к определенной электронной почте с сервера EWS Exchange

#c# #office365 #exchange-server #exchangewebservices

#c# #office365 #exchange-server #exchangewebservices

Вопрос:

Я пытаюсь получить конкретное электронное письмо от 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 , тему и т.д. в своей базе данных. В моем случае у меня могут быть электронные письма с той же темой и немного другим содержимым тела.

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

Есть ли хороший альтернативный способ получить конкретную электронную почту с сервера Exchange?

Ответ №1:

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

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

   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://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-export-items-by-using-ews-in-exchange

Комментарии:

1. Спасибо. Какое значение 4149 представлено в ExtendedPropertyDefinition? Не удалось найти подробности в документах.

2. Если идентификатор сообщения ненадежен, можно ли использовать EmailMessage.Id.UniqueID? Основываясь на этом документе, я подумал, что уникальный идентификатор более надежен learn.microsoft.com/en-us/exchange/client-developer /…

3. Это зависит от того, что вы пытаетесь сделать для большинства вещей, InternetMessageId будет работать нормально. Проблема с использованием уникального идентификатора заключается в том, что если сообщение перемещается между папками, это изменится. В противном случае посмотрите на что-то вроде свойства pidtagsearchkey learn.microsoft.com/en-us/office/client-developer/outlook/mapi /…