Получение всех писем в папке "Входящие" из управляемого API веб-служб Exchange и их хранение как.EML файлы
я хочу получить все письма в папке "Входящие" с помощью управляемого API EWS и сохранить их как .eml
. Проблема заключается в получении (1) все письма с (2) все заголовки (например, from, to, subject) (я храню информацию об этих значениях from
, to
и другие свойства где-то еще, поэтому они мне тоже нужны) и (3)byte[] EmailMessage.MimeContent.Content
. На самом деле мне не хватает понимания
-
Microsoft.Exchange.WebServices.Data.ItemView
, -
Microsoft.Exchange.WebServices.Data.BasePropertySet
и Microsoft.Exchange.WebServices.Data.ItemSchema
вот почему мне трудно.
мой основной код:
при создании PropertySet
следующим образом:
PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.MimeContent);
я получаю следующее исключение:
The property MimeContent can't be used in FindItem requests.
я не понимаю
(1) что это ItemSchema
и BasePropertySet
are
(2) и как мы должны их использовать
поэтому я удалил ItemSchema.MimeContent
:
PropertySet properties = new PropertySet(BasePropertySet.FirstClassProperties);
я написал простой следующий код, чтобы получить все письма во входящих:
ItemView view = new ItemView(50);
view.PropertySet = properties;
FindItemsResults<Item> findResults;
List<EmailMessage> emails = new List<EmailMessage>();
do
{
findResults = service.FindItems(WellKnownFolderName.Inbox, view);
foreach (var item in findResults.Items)
{
emails.Add((EmailMessage)item);
}
Console.WriteLine("Loop");
view.Offset = 50;
}
while (findResults.MoreAvailable);
выше я сохранил размер страницы ItemView
до 50, чтобы получить не более 50 писем за раз, а затем компенсировать его на 50, чтобы получить следующие 50 писем, если они есть. Однако он идет в бесконечном цикле и непрерывно печатает Loop
на консоли. Значит, я должен понимать!--17--> и offset
неправильно. Я хочу понять
(3) что pagesize
, offset
и offsetbasepoint
на ItemView
конструктор означает
(4) как они себя ведут и
(5) как использовать их для получения всех писем в папке "Входящие"
я не нашел никакой статьи в интернете, хорошо объясняющей это, но просто давая образцы кода. Оценит вопрос-мудрое объяснение, несмотря на то, что оно может оказаться длинным.
1 ответов
EWS немного несовместимо со свойствами, возвращаемыми из различных операций. пункт.Bind не будет возвращать те же свойства, что и FindItem. Ты правильно используя наборами свойств как определить, что вы хотите от сервера, но вы должны использовать их в нужном месте. Что вам нужно сделать, это найти элементы, а затем загрузить в них свойства. Это не идеально, но так работает EWS. С вашим циклом вы постоянно назначаете 50 к вашему смещению, когда вам нужно увеличивает его на 50. С моей макушки, что-то вроде этого сделало бы:
int offset = 0;
int pageSize = 50;
bool more = true;
ItemView view = new ItemView(pageSize, offset, OffsetBasePoint.Beginning);
view.PropertySet = PropertySet.IdOnly;
FindItemsResults<Item> findResults;
List<EmailMessage> emails = new List<EmailMessage>();
while(more){
findResults = service.FindItems(WellKnownFolderName.Inbox, view);
foreach (var item in findResults.Items){
emails.Add((EmailMessage)item);
}
more = findResults.MoreAvailable;
if (more){
view.Offset += pageSize;
}
}
PropertySet properties = (BasePropertySet.FirstClassProperties); //A PropertySet with the explicit properties you want goes here
service.LoadPropertiesForItems(emails, properties);
теперь у вас есть все элементы со всеми свойствами, которые вы запросили. FindItems часто не возвращает все свойства, которые вы хотите, даже если вы попросите их, поэтому загрузка только Id изначально, а затем загрузка свойств, которые вы хотите, как правило, путь. Вы также можете захотеть пакетной загрузки свойств каким - то образом в зависимости от того, сколько писем вы извлекаете, возможно, в цикл перед добавлением их в список EmailMessages. Вы также можете рассмотреть другие способы получения элементов, такие как служба.Утилита действие.