#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 /…