C# 要枚举Outlook文件夹吗

C# 要枚举Outlook文件夹吗,c#,.net,vb.net,outlook,C#,.net,Vb.net,Outlook,我正在寻找一些代码(首选C#或VB.NET)来迭代Outlook邮箱中的所有文件夹并返回这些文件夹的名称。我不希望弹出Outlook文件夹对话框,而是希望从Outlook外部返回给定邮箱中的文件夹名称 谢谢这实际上很容易使用(VisualStudioToolsforOffice)。首先使用VSTO创建Outlook 2007加载项。下面是我的一些实验代码,可以实现这一点 private void RecurseThroughFolders(Outlook.Folder theRootFol

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


谢谢

这实际上很容易使用(VisualStudioToolsforOffice)。首先使用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 );
}

我更喜欢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 GetAllFolders(文件夹)
{
foreach(文件夹中的Mapif文件夹){
收益率f;
foreach(GetAllFolders(f.Folders)中的var子文件夹){
生成返回子文件夹;
}
}
}
然后你可以像这样阅读文件夹。例如:

private IEnumerable<MailItem> GetAllEmail(NameSpace ns)
{
    foreach (var f in GetAllFolders(ns.Folders)) {
        if (f == DELETE_FOLDER) continue;
        if (f.DefaultItemType == OlItemType.olMailItem) {
            // Party!
        }
    }
}
private IEnumerable GetAllEmail(命名空间ns)
{
foreach(GetAllFolders(ns.Folders)中的变量f){
如果(f==删除_文件夹)继续;
如果(f.DefaultItemType==OlItemType.olMailItem){
//派对!
}
}
}