HOW TO: List Top Level Folders in a Mailbox using EWS Managed API 1.0

Now that developers have started using Exchange Web Services Managed API, I thought it would be nice for me to post some samples to do simple things using the API. This sample shows:

1)How to list the Top Level folders in a mailbox.
2)Using Paging with the FolderView class.
3)Enabling logging of the Request and Response.

 using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Exchange.WebServices.Data;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Xml;

namespace ListTopLevelFolders
{
    class Program
    {
        static void Main(string[] args)
        {
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
 
            // Enable Tracing
             service.TraceListener = new TraceListener();
            // Optional flags to indicate the requests and responses to trace.
            service.TraceFlags = TraceFlags.EwsRequest | TraceFlags.EwsResponse;
            service.TraceEnabled = true;
            
            //Change the Credentials to suit you needs
            service.Credentials = new WebCredentials("User", "Password", "domain");

            //Use Autodiscover or Set the URL manually. Change the email address to match yours
            service.AutodiscoverUrl("User@domain.com");
            
            //Uncomment to list the Top level folders
            ListTopLevelFolders(service,0);
            
            Console.ReadLine();
        }
        
        static void ListTopLevelFolders(ExchangeService service,int moffset)
        {
            int mPageSize =5;
            // Create a view with a page size of 5.
            FolderView view = new FolderView(mPageSize,moffset,OffsetBasePoint.Beginning);

            // Identify the properties to return in the results set.
            view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
            view.PropertySet.Add(FolderSchema.DisplayName);
            view.PropertySet.Add(FolderSchema.ChildFolderCount);
            
            // Unlike FindItem searches, folder searches can be deep traversals.
            view.Traversal = FolderTraversal.Shallow;

            // Send the request to search the mailbox and get the results.
            FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, view);

            // Process each item.
            foreach (Folder myFolder in findFolderResults.Folders)
            {
                if (myFolder is SearchFolder)
                {
                    Console.WriteLine("Search folder: " + (myFolder as SearchFolder).DisplayName);
                }

                else if (myFolder is ContactsFolder)
                {
                    Console.WriteLine("Contacts folder: " + (myFolder as ContactsFolder).DisplayName);
                }

                else if (myFolder is TasksFolder)
                {
                    Console.WriteLine("Tasks folder: " + (myFolder as TasksFolder).DisplayName);
                }

                else if (myFolder is CalendarFolder)
                {
                    Console.WriteLine("Calendar folder: " + (myFolder as CalendarFolder).DisplayName);
                }
                else
                {
                    // Handle a generic folder.
                    Console.WriteLine("Folder: " + myFolder.DisplayName);
                }
            }

            // Determine whether there are more folders to return.
            if (findFolderResults.MoreAvailable)
            {
                // Make recursive calls with offsets set for the FolderView to get the remaining folders in the result set.
                moffset = moffset + mPageSize;
                ListTopLevelFolders(service, moffset);
            }
            else
            {
                Console.WriteLine("More Available: " + findFolderResults.MoreAvailable);
            }
        }
    }
 
    class TraceListener : ITraceListener
    {
        #region ITraceListener Members

        public void Trace(string traceType, string traceMessage)
        {
            CreateXMLTextFile(traceType, traceMessage.ToString());
        }

        #endregion

        private void CreateXMLTextFile(string fileName, string traceContent)
        {
            // Create a new XML file for the trace information.
            try
            {
                // If the trace data is valid XML, create an XmlDocument object and save.
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(traceContent);
                xmlDoc.Save(fileName + ".xml");
            }
            catch
            {
                // If the trace data is not valid XML, save it as a text document.
                System.IO.File.WriteAllText(fileName + ".txt", traceContent);
            }
        }
    }
}

Enjoy!