2016-11-22 131 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(请记住它是异步的)。

相关问题