2009-05-14 3 views
4

Ich suche nach Code (C# oder VB.NET bevorzugt), um alle Ordner in einem Outlook-Postfach durchlaufen und die Namen dieser Ordner zurückgeben. Ich möchte nicht den Outlook-Ordner-Dialog öffnen, sondern die Ordner-Namen in einem bestimmten Postfach von außerhalb von Outlook zurückgeben.Outlook-Ordner aufzählen wollen

Dank

Antwort

7

Dies ist eigentlich ganz einfach VSTO (Visual Studio Tools für Office) verwenden. Zuerst Verwenden Sie VSTO, um ein Outlook 2007-Add-In zu erstellen. Hier ist ein Teil meines experimentellen Codes, der das tut.

private void RecurseThroughFolders(Outlook.Folder theRootFolder, int depth) 
    { 
     if (theRootFolder.DefaultItemType != Outlook.OlItemType.olMailItem) { 
      return; 
     } 

     Console.WriteLine("{0}", theRootFolder.FolderPath); 

     foreach(Object item in theRootFolder.Items) { 
      if (item.GetType() == typeof(Outlook.MailItem)) { 
       Outlook.MailItem mi = (Outlook.MailItem)item; 
       if (mi.Categories.Length > 0) { 
        WriteLinePrefix(depth); 
        Console.WriteLine(" $ {0}", mi.Categories); 
       } 
      } 
     } 

     foreach (Outlook.Folder folder in theRootFolder.Folders) { 
      RecurseThroughFolders(folder, depth + 1); 
     } 
    } 

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    Outlook.Application olApp = new Outlook.Application(); 

    Console.WriteLine("Default Profile = {0}", olApp.DefaultProfileName); 

    Console.WriteLine("Default Store = {0}", olApp.Session.DefaultStore.DisplayName); 

    selectExplorers = this.Application.Explorers; 
    selectExplorers.NewExplorer += new Outlook.ExplorersEvents_NewExplorerEventHandler(newExplorer_Event); 

    Outlook.Folder theRootFolder = (Outlook.Folder) olApp.Session.DefaultStore.GetRootFolder(); 
    RecurseThroughFolders(theRootFolder, 0); 
} 
3

Ich ziehe einen LINQ freundlicheren Ansatz:

private IEnumerable<MAPIFolder> GetAllFolders(Folders folders) 
{ 
    foreach (MAPIFolder f in folders) { 
     yield return f; 
     foreach (var subfolder in GetAllFolders(f.Folders)) { 
      yield return subfolder; 
     } 
    } 
} 

Dann können Sie die Ordner jede mögliche Weise, wie zu lesen. Zum Beispiel:

private IEnumerable<MailItem> GetAllEmail(NameSpace ns) 
{ 
    foreach (var f in GetAllFolders(ns.Folders)) { 
     if (f == DELETE_FOLDER) continue; 
     if (f.DefaultItemType == OlItemType.olMailItem) { 
      // Party! 
     } 
    } 
}