2014-10-24 3 views
4

Мне нужно пропустить все непрочитанные сообщения в папке «Входящие» и загрузить первое вложение для каждого письма, мой код работает, но только для первого сообщения электронной почты, почему?EWS foreach все непрочитанные сообщения не работают

/* load all unread emails */ 
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, sf, new ItemView(1)); 

/* loop through emails */ 
foreach (EmailMessage item in findResults) 
{ 
    item.Load(); 

    /* download attachment if any */ 
    if (item.HasAttachments && item.Attachments[0] is FileAttachment) 
    { 
     Console.WriteLine(item.Attachments[0].Name); 
     FileAttachment fileAttachment = item.Attachments[0] as FileAttachment; 

     /* download attachment to folder */ 
     fileAttachment.Load(downloadDir + fileAttachment.Name); 
    } 

    /* mark email as read */ 
    item.IsRead = true; 
    item.Update(ConflictResolutionMode.AlwaysOverwrite); 
} 

Console.WriteLine("Done"); 

В моем почтовом ящике он установил первое электронное письмо для чтения, но потом скрипт остановился и напишите «Готово». к консольному окну. Что не так ?

+0

Может быть, ваши изменения коллекции в то время как в итерации по коллекции? Что увидитResults.Count вернуться до начала цикла? –

ответ

4

Проблема в том, что вы запрашиваете только один элемент из Exchange.

FindItemsResults<Item> findResults = service.FindItems(
    WellKnownFolderName.Inbox, 
    sf, 
    new ItemView(1)); 

ItemView class конструктор принимает размер страницы в качестве параметра, который определяется как:

Максимальное количество элементов операции поиска возвращает.

Итак, вы запрашиваете один элемент, который объясняет, почему ваш foreach завершает работу после этого одного элемента.

Чтобы проверить это, вы можете просто увеличить pageSize к чему-то более разумным, как 100 или 1000.

Но, чтобы исправить это, вы должны следовать идиоматическое двухконтурных:

SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
FindItemsResults<Item> findResults; 
ItemView view = new ItemView(100); 
do { 
    findResults = service.FindItems(WellKnownFolderName.Inbox, sf, view); 
    foreach (var item in findResults.Items) { 
     // TODO: process the unread item as you already did 
    } 
    view.Offset = findResults.NextPageOffset; 
} 
while (findResults.MoreAvailable); 

Здесь мы продолжаем извлечение большего количества предметов из Exchange (в партиях по 100), если оно говорит нам, что доступно больше предметов.

+0

Он работает, спасибо! :-) – Muflix

2

общественного недействительный readMail() {

 ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010); 
     service.Credentials = new WebCredentials("uname", "password", "domain"); 
     service.Url = new Uri("URL"); 
     System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 

     SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
     FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, searchFilter, new ItemView(int.MaxValue)); 
      foreach (EmailMessage item in findResults.Items) 
      { 

        item.Load(); 
        if (item.HasAttachments) 
        { 
         foreach (var i in item.Attachments) 
         { 
          try 
          { 
           FileAttachment fileAttachment = i as FileAttachment; 
           fileAttachment.Load("C:\\Users\\xxxxx\\Desktop\\comstar\\Download\\test\\" + fileAttachment.Name); 
          } 

          catch(Exception e) 
          { 
           Console.Write(e); 
          } 

         } 
        } 
        //set mail as read 
        item.IsRead = true; 
        item.Update(ConflictResolutionMode.AutoResolve); 

       } 

    } 
+1

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно _how_ и/или _why_, он решает проблему, улучшив долгосрочную ценность ответа. –