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