2016-11-22 1 views
0

Je souhaite imiter la dernière version de la fonctionnalité de recherche d'Outlook via C# et un formulaire Windows. Plus précisément, je veux "Rechercher toutes les boîtes aux lettres" pour une chaîne donnée. Il y a plus de 50 dossiers et 90 000 courriels.Comment puis-je "Rechercher toutes les boîtes aux lettres" dans tous les dossiers de boîtes aux lettres partagés Outlook à la fois via C#?

Actuellement, je peux rechercher un dossier en utilisant LINQ et obtenir des résultats. J'ai écrit du code pour parcourir tous les dossiers et créer un IEnumberable massif que je peux interroger.

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; 

      } 

     } 

Cela finit par fonctionner, mais vous pouvez probablement imaginer que c'est terriblement lent et en tant que tel est inutile. Je suis nouveau à LINQ et je pense qu'il doit y avoir un moyen plus rapide. Ce code peut-il être ajusté? Je ne suis pas un administrateur Exchange et je n'ai pas accès aux serveurs Exchange au-delà de ma propre boîte de réception. Aussi je ne suis pas marié à LINQ et serais heureux d'utiliser d'autres méthodes. J'apprécierai votre aide. REMARQUE: Je viens de remarquer que le code ci-dessus traverse deux fois le dossier [1]. Je peux corriger cela, mais cela n'influe pas de façon significative sur le temps que cela prend.

Répondre

0

Non, n'utilisez pas LINQ avec OOM. Utilisez Items.Find/FindNext ou Items.Restrict.

Vous pouvez également utiliser Aplication.AdvancedSearch (rappelez-vous qu'il est asynchrone).