想要枚举Outlook文件夹

时间:2009-05-14 03:07:53

标签: c# .net vb.net outlook

我正在寻找一些代码(首选C#或VB.NET)来迭代Outlook邮箱中的所有文件夹并返回这些文件夹的名称。我不打算弹出Outlook文件夹对话框,而是从Outlook外部返回给定邮箱中的文件夹名称。

由于

2 个答案:

答案 0 :(得分:7)

使用VSTO(Visual Studio Tools for 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 );
}

答案 1 :(得分: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!
        }
    }
}