14

How to retrieve all items from "public folders" and its "sub-folders" in 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;
         } 
}

"If i do like this i am not getting items present in sub-folders of it..public folders does not support deep traversal queries too..How can i get items from sub-folders of public folders???"

user1891567
  • 681
  • 2
  • 10
  • 15

4 Answers4

48

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.

ono2012
  • 4,967
  • 2
  • 33
  • 42
3

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

Henning Krause
  • 5,302
  • 3
  • 24
  • 37
  • Thank u so much for your reply Henning, Can u Send me any sample code that perform Recursive traversal.It will be so much helpfull for me. – user1891567 Dec 18 '12 at 04:33
  • I done as u told.I retrieved upto 2-level of publicfolder Hierachy.How to perform that for n-level in the PF hierachy.'FindFoldersResults findFoldersResults = service.FindFolders(WellKnowFolderName.PublicFolderRoot,folderview); foreach (Folder folder1 in findFoldersResults.Folders) { FindItemsResults findResults=service.FindItems(folder1.Id,iv); foreach (Item item in findResults) {//Iteminfo;} foreach (Folder folder2 in folder1.Folders) { FindItemsResultsfindResults=service.FindItems(folder2.Id,iv); {//Iteminfo;}}} ' – user1891567 Dec 20 '12 at 05:28
  • Hi, you would write a method which processes one folder and then call that method recursively for each subfolder. – Henning Krause Dec 20 '12 at 10:37
  • Hi Henning, Can u Send me any sample code or Skeleton of the code for the processes u told now...If i created a Method i have to pass the subfolder id to find items in every subfolder.But i can get the id of subfolder,so i done like i commeted above. – user1891567 Dec 20 '12 at 11:13
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;
}
bacca87
  • 43
  • 6
0
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;
}
Robert
  • 7,394
  • 40
  • 45
  • 64
  • Hey, welcome to stackoverflow. You could greatly improve this answer by explaining the code a bit. In particular, why do you swallow exceptions? – Robert Aug 17 '19 at 21:19