代码之家  ›  专栏  ›  技术社区  ›  JaggenSWE

无法从非默认邮箱上的Outlook 2016获取文件夹

  •  0
  • JaggenSWE  · 技术社区  · 7 年前

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

    如果我用 storeIdx 设置为1(这是我的个人邮箱)效果很好,但如果我尝试在 商店IDX 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中,我可以很好地看到它们并与它们一起工作。

    任何帮助都将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Kenshinaro    7 年前

    你可以得到所有这样的文件夹:

    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;
    }