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个子文件夹。

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

   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)
     {
     }
  }

正如Dmitry所指出的,您需要使用递归才能枚举所有文件夹。在《枚举文件夹》文章中阅读有关此信息的更多信息。例如:

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对象。例如,foreach循环中使用的Fodlers属性返回相应类的新实例增加参考计数器。

使用System.Runtime.InterOpservices.Marshal.ReleaseComobject在使用它完成后以释放Outlook对象。如果您的加载项尝试在Microsoft Exchange Server上存储的收藏集中的256多个Outlook项目,这一点尤其重要。如果您不及时释放这些对象,则可以在任何时候以最大打开的物品数量交换来达到限制。然后在Visual Basic(C#中的null(中为Nothing设置一个变量,以发布对对象的引用。在系统发行的对象文章中阅读有关此信息的更多信息。

最新更新