2016-11-22 108 views
0

我想通過c#和windows窗體來模擬Outlook的搜索功能的最新版本。具體來說,我想爲給定的字符串「搜索所有郵箱」。有超過50個文件夾和90,000封電子郵件。如何通過c#一次在所有Outlook共享郵箱文件夾中「搜索所有郵箱」?

目前,我可以使用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

沒有與OOM一起使用LINQ。使用Items.Find/FindNextItems.Restrict

您也可以使用Aplication.AdvancedSearch(請記住它是異步的)。

相關問題