【问题标题】:How To Get all ITEMS from Folders and Sub-folders of PublicFolders Using EWS Managed API如何使用 EWS 托管 API 从 PublicFolders 的文件夹和子文件夹中获取所有项目
【发布时间】:2012-12-02 09:25:16
【问题描述】:

如何在exchange server2010 uisng managed API中从“公共文件夹”及其“子文件夹”中检索所有项目???

rootfolder = Folder.Bind(service,WellKnownFolderName.PublicFoldersRoot);
rootfolder.Load();                                             
foreach (Folder folder in rootfolder.FindFolders(new FolderView(int.MaxValue)))
{
FindItemsResults<Item> findResults = folder.FindItems(iv); 
 foreach (Item item in findResults)

         {
            //get item info;
         } 
}

“如果我这样做,我不会在它的子文件夹中获取项目。公共文件夹也不支持深度遍历查询。我如何从公共文件夹的子文件夹中获取项目???”

【问题讨论】:

    标签: c# api exchange-server exchangewebservices


    【解决方案1】:

    要获取所有文件夹,请使用以下代码:

    public void GetAllFolders(ExchangeService service, List<Folder> completeListOfFolderIds)
        {
            FolderView folderView = new FolderView(int.MaxValue);
            FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, folderView);
            foreach (Folder folder in findFolderResults)
            {
                completeListOfFolderIds.Add(folder);
                FindAllSubFolders(service, folder.Id, completeListOfFolderIds);
            }
        }
    
    private void FindAllSubFolders(ExchangeService service, FolderId parentFolderId, List<Folder> completeListOfFolderIds)
        {
            //search for sub folders
            FolderView folderView = new FolderView(int.MaxValue);
            FindFoldersResults foundFolders = service.FindFolders(parentFolderId, folderView);
    
            // Add the list to the growing complete list
            completeListOfFolderIds.AddRange(foundFolders);
    
            // Now recurse
            foreach (Folder folder in foundFolders)
            {
                FindAllSubFolders(service, folder.Id, completeListOfFolderIds);
            }
        }
    

    获取所有项目:

    List<Folder> completeListOfFolderIds = new List<Folder>();
    //Fills list with all public folders and subfolders
    GetAllFolders(service, completeListOfFolderIds);
    foreach(Folder folder in completeListOfFolderIds)
    {
    ItemView itemView = new ItemView(int.MaxValue);
    FindItemsResults<Item> searchResults = service.FindItems(folder.Id, itemView);
    //do something with item list    
    }
    

    仅供参考 FindFolders /FindItems 仅返回前 1000 个项目,因此如果您有大量结构,则必须更改此代码以克服该问题。

    【讨论】:

    • 非常感谢您的回复 ono2012
    • 请将此标记为答案/赞成票,准备这些答案需要时间。
    • 仅在 EWS 2 VS 2010 中重新运行 publicFolderRoot
    【解决方案2】:

    您需要对公共文件夹树执行递归遍历。您不能对公用文件夹执行深度遍历。

    【讨论】:

    • 非常感谢您的回复 Henning,您可以给我发送任何执行递归遍历的示例代码。这对我很有帮助。
    • 我按照你说的做了。我检索到 2 级公共文件夹 Hierachy。如何在 PF 层次结构中为 n 级执行该操作。'FindFoldersResults findFoldersResults = service.FindFolders(WellKnowFolderName.PublicFolderRoot,folderview ); foreach(findFoldersResults.Folders 中的文件夹 folder1){ FindItemsResults findResults=service.FindItems(folder1.Id,iv); foreach (findResults 中的项目项) {//Iteminfo;} foreach (folder1.Folders 中的文件夹 folder2) { FindItemsResultsfindResults=service.FindItems(folder2.Id,iv); {//Iteminfo;}}} '
    • 您好,您将编写一个处理一个文件夹的方法,然后为每个子文件夹递归调用该方法。
    • 嗨 Henning,你能把你现在告诉的过程的任何示例代码或代码骨架发送给我吗...如果我创建了一个方法,我必须传递子文件夹 ID 才能在每个子文件夹中查找项目.但我可以得到子文件夹的ID,所以我像上面提到的那样做了。
    【解决方案3】:
    public IEnumerable<Item> FindItemsInSubfolders(FolderId root, SearchFilter itemsFilter)
    {
        foreach (Folder folder in service.FindFolders(root, new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep }))
            foreach(Item item in service.FindItems(folder.Id, itemsFilter, new ItemView(int.MaxValue)))
                yield return item;
    
        foreach (Item item in service.FindItems(root, itemsFilter, new ItemView(int.MaxValue)))
            yield return item;
    }
    

    【讨论】:

      【解决方案4】:
      List<Folder> completeListOfFolderIds = new List<Folder>();
      GetAllFolders(service, completeListOfFolderIds);
      foreach (Folder folder in completeListOfFolderIds)
      {
          List<Item> results = GetItems(service, folder);
      }
      
      public void GetAllFolders(ExchangeService service, List<Folder> completeListOfFolderIds)
      {
          ExtendedPropertyDefinition isHiddenProp = new ExtendedPropertyDefinition(0x10f4, MapiPropertyType.Boolean);
          FolderView folderView = new FolderView(int.MaxValue);
          folderView.PropertySet = new PropertySet(isHiddenProp,FolderSchema.DisplayName, FolderSchema.Id, FolderSchema.ChildFolderCount, FolderSchema.TotalCount, FolderSchema.ParentFolderId, FolderSchema.WellKnownFolderName);
          List<SearchFilter> searchFilterCollection = new List<SearchFilter>();
          searchFilterCollection.Add(new SearchFilter.IsEqualTo(isHiddenProp, false));
          SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection.ToArray());
          Folder rootfolder = Folder.Bind(service, WellKnownFolderName.MsgFolderRoot);
          // Indicate a Traversal value of Deep, so that all subfolders are retrieved.
          folderView.Traversal = FolderTraversal.Deep;
          rootfolder.Load();
          //FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, folderView);
          FindFoldersResults findFolderResults = rootfolder.FindFolders(searchFilter, folderView);
          foreach (Folder folder in findFolderResults)
          {
              completeListOfFolderIds.Add(folder);
              //List<Item> results = GetItems(service, folder);
              FindAllSubFolders(service, folder.Id, completeListOfFolderIds);                
          }
      }
      
      private void FindAllSubFolders(ExchangeService service, FolderId parentFolderId, List<Folder> completeListOfFolderIds)
      {
          FolderView folderView = new FolderView(int.MaxValue);
          FindFoldersResults foundFolders = service.FindFolders(parentFolderId, folderView);
          completeListOfFolderIds.AddRange(foundFolders);
      
          // Now recurse
          foreach (Folder folder in foundFolders)
          {
              FindAllSubFolders(service, folder.Id, completeListOfFolderIds);
          }
      }
      
      private List<Item> GetItems(ExchangeService service ,Folder folder)
      {
          if (service == null)
          {
              return null;
          }
          List<Item> items = new List<Item>();
          PropertySet propertySet = new PropertySet(BasePropertySet.FirstClassProperties);
          const Int32 pageSize = 50;
          ItemView itemView = new ItemView(pageSize);
          itemView.PropertySet = propertySet;
          FindItemsResults<Item> searchResults = null;
          try
          {
              do
              {                    
                  searchResults = service.FindItems(folder.Id,itemView);
                  items.AddRange(searchResults.Items);
                  itemView.Offset += pageSize;
              } while (searchResults.MoreAvailable);
          }
          catch (Exception ex)
          {                
          }
          return items;
      }
      

      【讨论】:

      • 嗨,欢迎来到 stackoverflow。您可以通过稍微解释一下代码来大大改善这个答案。特别是,你为什么要吞下异常?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2011-11-27
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多