Outlook Email子文件夹迭代

时间:2019-07-29 19:00:05

标签: c# outlook

我正在尝试迭代文件夹的子文件夹和子文件夹。例如。收件箱有五个子文件夹,因此我尝试迭代所有五个子文件夹。但是我只能迭代第一个子文件夹。

 Outlook.MAPIFolder inboxFolder = 
 ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
 Outlook.Stores stores = ns.Stores;


 foreach(Store store in stores)
 {

      Outlook.MAPIFolder inbox_folder = 
      store.GetDefaultFolder(outlook.olDefaultFolders.olFolderInbox);

             foreach(Outlook.MailItem item in Inbox_folder.items)
             {
                   //code for attachment
              }
}

当我要迭代子文件夹的子文件夹时,它仅返回文件夹的第一个子文件夹。我要迭代文件夹的第n个子文件夹。

2 个答案:

答案 0 :(得分:1)

处理文件夹的代码必须递归调用

   foreach(Store store in stores)
   {
      Outlook.MAPIFolder inbox_folder = 
      store.GetDefaultFolder(outlook.olDefaultFolders.olFolderInbox);
      ProcessFolder(inbox_folder);
   }
  ...    

  private void ProcessFolder(MAPIFolder folder)
  {
     //subfolders
     foreach(MAPIFolder subFolder in folder.Folders)
     {
        ProcessFolder(subFolder);
     } 
     //items
     foreach (Object item in folder.Items)
     {
     }
  }

答案 1 :(得分:0)

正如Dmitry所述,您需要使用递归才能枚举所有文件夹。在Enumerate folders文章中了解有关此内容的更多信息。例如:

private void EnumerateFoldersInDefaultStore()
{
    Outlook.Folder root =
        Application.Session.
        DefaultStore.GetRootFolder() as Outlook.Folder;
    EnumerateFolders(root);
}

// Uses recursion to enumerate Outlook subfolders.
private void EnumerateFolders(Outlook.Folder folder)
{
    Outlook.Folders childFolders = folder.Folders;
    if (childFolders.Count > 0)
    {
        foreach (Outlook.Folder childFolder in childFolders)
        {
            // Write the folder path.
            Debug.WriteLine(childFolder.FolderPath);
            // Call EnumerateFolders using childFolder.
            EnumerateFolders(childFolder);
        }
    }
}               

尽管Microsoft在示例代码中显示了foreach循环,但这并不是枚举文件夹的最佳方法。我建议改用for循环。因此,您将能够立即释放基础COM对象。例如,在Fodlers循环中使用的foreach属性返回相应类的新实例,从而增加了参考计数器。

在完成使用后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。如果您的加载项尝试枚举Microsoft Exchange Server上存储的集合中的256个以上Outlook项目,则这尤其重要。如果不及时释放这些对象,则可以达到Exchange对任何一次打开的最大项目数施加的限制。然后在Visual Basic中将变量设置为Nothing(在C#中为null)以释放对该对象的引用。在Systematically Releasing Objects文章中了解有关此内容的更多信息。