【问题标题】:Cannot get folders from Outlook 2016 on a non-default mailbox无法从非默认邮箱上的 Outlook 2016 获取文件夹
【发布时间】:2018-10-12 12:46:34
【问题描述】:

我正在尝试使用 Microsoft Office Interops 列出所有文件夹(以便稍后从一个特定文件夹中获取消息)。

如果我在 storeIdx 设置为 1(这是我的个人邮箱)的情况下运行此代码,效果很好,但如果我尝试在 storeIdx 2(我也使用的共享邮箱)上运行此代码,它绝对返回什么都没有:

    private void ProcessMail()
    {
        Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
        _NameSpace ns = app.GetNamespace("MAPI");
        int storeIdx = 2;

        MAPIFolder inbox = ns.Stores[storeIdx].GetDefaultFolder(OlDefaultFolders.olFolderInbox);

        Console.WriteLine("Getting folders from mailbox: " + ns.Stores[storeIdx].DisplayName + " in folder " + inbox.Name +"\r\n");
        Console.WriteLine("FOLDERS:\r\n");

        foreach (MAPIFolder f in inbox.Folders)
        {
            Console.WriteLine(f.Name + " (" + f.FullFolderPath + ")");
        }
    }

在阅读各种网站(MSDN 等)后,我尝试了几种不同的方法,但它根本不会显示共享邮箱收件箱中的任何子文件夹。在 Outlook 中,我可以很好地查看它们并使用它们。

邮箱都在同一个 Exchange 服务器上。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# outlook office-interop


    【解决方案1】:

    您可以像这样获取所有文件夹:

    Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
    List<Folder> folders = new List<Folder>();
    foreach(Folder f in app.Session.Folders)
    {
        if(ff.DefaultMessageClass.Contains("IPM.Post")
            folders.Add(f);
        folders.AddRange(GetSubFolders(f));
        // Dont forget to release the object cause Outlook don't like too many open obejcts
        Marshal.ReleaseComObject(f);
    }
    

    获取子文件夹:

    public List<Folder> GetSubFolders(Folder f)
    {
        List<Folder> folders = new List<Folder>();
        if(f.Folders.Count > 0)
        {
            foreach(Folder ff in f.Folders)
            {
                if(ff.DefaultMessageClass.Contains("IPM.Post")
                    folders.Add(ff);
                folders.AddRange(GetSubFolders(ff));
                Marshal.ReleasComObject(ff);
            }
        }
        return folders;
    }
    

    【讨论】:

      【解决方案2】:

      我认为 GetNamespace obj 的集合 Stores 代表当前配置文件(当前会话)中可用的所有商店。您可以使用NameSpace.GetSharedDefaultFolder 获取共享邮箱。

      参考链接:Get list of all Outlook folders and subfolders

      【讨论】:

        猜你喜欢
        • 2014-04-14
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        • 2011-05-19
        • 1970-01-01
        • 2015-10-02
        相关资源
        最近更新 更多