2016-11-22 1 views
0

Я хочу подражать последней версии функции поиска Outlook с помощью C# и формы окна. В частности, я хочу «Искать все почтовые ящики» для данной строки. Есть более 50 папок и 90 000 писем.Как я могу «найти все почтовые ящики» во всех папках общего почтового ящика Outlook через C#?

В настоящее время я могу искать любую папку с помощью LINQ и получать результаты. Я написал код для повторения всех папок и создания одного массивного IEnumberable, который я могу запросить.

public IEnumerable<MailItem> SharedInbox 
    { 

     get 
     { 
      outlook.ActiveExplorer().Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox); 
      Outlook.Recipient recip = Outlook.Application.Session.CreateRecipient("[email protected]"); 
      Microsoft.Office.Interop.Outlook.MAPIFolder folder = 
        outlook.GetNamespace("MAPI").GetSharedDefaultFolder(recip, OlDefaultFolders.olFolderInbox); 
      Folders subFolders = folder.Folders; 
      IEnumerable<MailItem> mItems = folder.Folders[1].Items.OfType<MailItem>(); 

      if (recip.Resolve()) 
      { 
       System.Diagnostics.Debug.WriteLine("Email Address Resolve Successful.\r\n"); 
       try 
       { 
        foreach (MAPIFolder fold in subFolders) 
        { 
         System.Diagnostics.Debug.WriteLine("Try Folder: " + fold.Name + " \r\n"); 
         try 
         { 
          mItems = mItems.Concat(fold.Items.OfType<MailItem>()); 
         } 
         catch 
         { System.Diagnostics.Debug.WriteLine("No items found:\r\n"); } 
        } 


        return mItems; 
       } 
       catch 
       { 
        return null; 
       } 

      } 
      else 
      { 
       System.Diagnostics.Debug.WriteLine("ELSE"); 
       return null; 

      } 

     } 

В конечном итоге это работает, но вы можете себе представить, что это мучительно медленно и как таковое бесполезно. Я новичок в LINQ, и я чувствую, что должен быть более быстрый способ. Можно ли настроить этот код? Я не администратор Exchange и не имею доступа к серверам Exchange, кроме моего собственного почтового ящика. Также я не женат на LINQ и буду рад использовать другие методы. Буду признателен за вашу помощь.

ПРИМЕЧАНИЕ. Я заметил, что приведенный выше код дважды проходит через папку [1]. Я могу это исправить, но это существенно не влияет на время, которое требуется.

ответ

0

Не использовать LINQ с OOM. Используйте Items.Find/FindNext или Items.Restrict.

Вы также можете использовать Aplication.AdvancedSearch (имейте в виду, что он асинхронный).

Смежные вопросы