Получение всех писем в папке "Входящие" из управляемых API веб-служб Exchange и их хранение в виде файлов .eml

Я хочу получить все письма в папке "Входящие" с помощью EWS Managed API и сохранить их как .eml. Проблема заключается в извлечении (1) всех писем с помощью (2) всех заголовков (например, от, до, темы) (я сохраняю информацию о тех значениях 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

(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 на консоли. Поэтому я должен понимать неправильно pagesize и offset. Я хочу понять

(3), что pagesize, offset и offsetbasepoint в ItemView конструктор означает

(4), как они себя ведут и

(5), как использовать их для извлечения всех писем в папке "Входящие"

Я не нашел ни одной статьи в сети, хорошо объясняя это, но просто давая образцы кода. По достоинству оценят сомнительное объяснение, несмотря на то, что это может затянуться.

Ответ 1

EWS немного несовместим со свойствами, возвращаемыми из различных операций. Item.Bind не возвращает те же свойства, что и FindItem. Вы правильно используете PropertySets, чтобы определить, что вы хотите от сервера, но вы должны использовать их в нужном месте. Что вам нужно сделать, это найти элементы, а затем загрузить в них свойства. Это не идеально, а то, как работает 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 часто не возвращает все свойства, которые вы хотите, даже если вы их попросите, поэтому сначала загружает только идентификатор, а затем загружает нужные вам свойства, как правило, это путь. Вы также можете выполнить загрузку свойств каким-либо образом в зависимости от того, сколько писем вы извлекаете, возможно, в цикле, прежде чем добавлять их в список сообщений электронной почты. Вы также можете рассмотреть другие методы получения предметов, например, действие service.SyncFolder.