2009-05-14 3 views
4

Я ищу некоторый код (предпочтительнее C# или VB.NET), чтобы перебирать все папки в почтовом ящике Outlook и возвращать имена этих папок. Я не хочу всплывать диалоговое окно папки Outlook, а скорее возвращать имена папок в заданном почтовом ящике из внешнего Outlook.Хотите перечислить папки Outlook

Благодаря

ответ

7

Это на самом деле довольно легко с помощью VSTO (инструментов Visual Studio для Office). Сначала используйте VSTO для создания Outlook 2007. Вот некоторые из моих экспериментальных кодов, которые делают это.

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

Я предпочитаю более LINQ дружественный подход:

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

Затем вы можете знакомиться папки любым способом, как. Например:

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