2016-11-22 6 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/FindNext 또는 Items.Restrict을 사용하십시오.

Aplication.AdvancedSearch (비동기입니다.)을 사용할 수도 있습니다.