User1454 Ответов: 1

Как получить более 2000 почтовых отправлений в веб-службе exchange на языке C#


Всем привет,
У меня есть почтовый ящик, который содержит 2068 почтовых отправлений. Мне нужно восстановить все 2068 писем. Но согласно моему коду, это пропускает 1000 писем, то есть изначально он показывает общее количество как 2068 и извлекает 1000 писем в первом цикле и показывает количество как 1000 (pagesize=1000), но во втором цикле он показывает количество как 68 и пропускает 1000 писем, а NextPageOffset равен нулю. Что я делаю не так?

Что я уже пробовал:

int pageSize = 1000;
FindFoldersResults findFolderItems = service.FindFolders(WellKnownFolderName.Inbox, sourceFolderFilter, new FolderView(1));
ItemView view = new ItemView(pageSize);
do
{
findMailItems = service.FindItems(findFolderItems.Folders[0].Id, searchFilter, view);                                
if (findMailItems.TotalCount > 0)
{
    foreach (var item in findMailItems.Items)
    {
         item.Move(folderId);
    }
}
view.Offset = findMailItems.NextPageOffset.Value;
}
 while (findMailItems.MoreAvailable);

1 Ответов

Рейтинг:
1

Richard Deeming

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

Рассмотрим упрощенный пример с тремя сообщениями, перемещающимися по одному за раз:

  1. Входящие: [ "A", "B", "C" ];
  2. Получить сообщение 0: "A";
  3. Подвиньте "A" в другую папку;
  4. Входящие: [ "B", "C" ];
  5. Получить сообщение 1: "C"
  6. Подвиньте "C" в другую папку;
  7. Входящие: ["B"]
  8. Получить сообщение 2: Ошибка


Как и в случае с любым циклом, который изменяет коллекцию, которую он повторяет, вам нужно настроить индекс, чтобы учесть ваши изменения.
do
{
    findMailItems = service.FindItems(findFolderItems.Folders[0].Id, searchFilter, view);
    if (findMailItems.TotalCount > 0)
    {
        foreach (var item in findMailItems.Items)
        {
            item.Move(folderId);
        }
    }
    
    // NB: Don't change the view.Offset here!
}
while (findMailItems.MoreAvailable);


User1454

Спасибо Ричарду Димингу за краткое объяснение !!! Я попробую..

User1454

Не могли бы вы помочь мне, где добавить индекс, чтобы он занял следующий набор почтового списка ? Я попробовал несколько способов, но ничего не вышло.. :(

Richard Deeming

Вы не. Как я уже объяснял, вы перемещаете элементы в другую папку. Это означает, что то, что раньше было сообщением 1000, теперь будет сообщением 0. Если вы увеличите смещение, вы пропустите целую страницу сообщений.

User1454

Привет, Ричард Диминг, огромное спасибо! Моя ошибка.. понял четко и теперь работает как шарм.. но везде встречается с увеличением смещения. в любом случае, большое спасибо. :)