How To Get all ITEMS from Folders and Sub-folders of PublicFolders Using EWS Managed API

后端 未结 4 978
小蘑菇
小蘑菇 2020-12-03 17:33

How to retrieve all items from \"public folders\" and its \"sub-folders\" in exchange server2010 uisng managed API???

rootfolder = Folder.Bind(service,WellKn         


        
相关标签:
4条回答
  • 2020-12-03 18:12

    To get all folders use the code below:

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

    To get all items:

    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    
    }
    

    FYI FindFolders /FindItems only returns first 1000 items, so you'll have to alter this code to overcome that if you have massive structures.

    0 讨论(0)
  • 2020-12-03 18:14
    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;
    }
    
    0 讨论(0)
  • 2020-12-03 18:19

    You Need to perform a recursive traversal of the public Folder tree. You cannot perform a deep traversal on public folders.

    0 讨论(0)
  • 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;
    }
    
    0 讨论(0)
提交回复
热议问题