Search folders in public folders by naming PATH

Is it possible to find all folders and souffles in public folders by specifying the folder path using the Exchange Managed Web Service (EWS)?

+4
source share
2 answers

You can only search inside folders at the same level in EWS so that:

PublicFoldersRoot \ subjectA \ sectionB \ PARTC \

I would search the β€œsubjectA” folder, and then when I have this FolderId, then I would search the β€œsectionB” folder and so on until I find what I need.

The GetPublicFolderByPath method takes the path "subjectA \ sectonB \ partC \" and splits the path into an array of folder names, and then finds each folder recursively.

 public Folder GetPublicFolderByPath(ExchangeService service, String ewsFolderPath) { String[] folders = ewsFolderPath.Split('\'); Folder parentFolderId = null; Folder actualFolder = null; for (int i = 0; i < folders.Count(); i++) { if (0 == i) { parentFolderId = GetTopLevelFolder(service, folders[i]);// for first first loop public folder root is the parent actualFolder = parentFolderId; //in case folders[] is only one long } else { actualFolder = GetFolder(service, parentFolderId.Id, folders[i]); parentFolderId = actualFolder; } } return actualFolder; } 

The GetTopLevelFolder method gets the first folder "sectionA", which is a child of the aka "WellKnownFolderName.PublicFoldersRoot" public folder root.

 private Folder GetTopLevelFolder(ExchangeService service, String folderName) { FolderView folderView = new FolderView(int.MaxValue); FindFoldersResults findFolderResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, folderView); foreach (Folder folder in findFolderResults) { if (folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase)) { return folder; } } throw new Exception("Top Level Folder not found: " + folderName); } 

The GetFolder method accepts the parent FolderId and searches for all child folders to match the name and returns the child file FolderId that you requested.

 private Folder GetFolder(ExchangeService service, FolderId ParentFolderId, String folderName) { FolderView folderView = new FolderView(int.MaxValue); FindFoldersResults findFolderResults = service.FindFolders(ParentFolderId, folderView); foreach (Folder folder in findFolderResults) { if (folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase)) { return folder; } } throw new Exception("Folder not found: " + folderName); } 

Please note that I am using a DLL with a Microsoft.Exchange.WebServices managed API, a similar idea for https://yourexchangeserver/ews/services.wsdl . To get the folder from the path, create an ExchangeService object, and then write:
GetPublicFolderByPath(service, "subjectA\sectionB\partC\")

Please vote if this helps you :)

+10
source

Here the wrapper based on @ ono2012 answers

 using System; using System.DirectoryServices.AccountManagement; using System.Linq; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using Microsoft.Exchange.WebServices.Data; namespace EmailServices.Web.IntegrationTests { // http://msdn.microsoft.com/en-us/library/exchange/jj220499(v=exchg.80).aspx internal class MsExchangeServices { public MsExchangeServices() { ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack; m_exchangeService = new ExchangeService { UseDefaultCredentials = true }; // Who running this test? They better have Exchange mailbox access. m_exchangeService.AutodiscoverUrl(UserPrincipal.Current.EmailAddress, RedirectionUrlValidationCallback); } public ExchangeService Service { get { return m_exchangeService; } } public Folder GetPublicFolderByPath(string ewsFolderPath) { string[] folders = ewsFolderPath.Split('\\'); Folder parentFolderId = null; Folder actualFolder = null; for (int i = 0; i < folders.Length; i++) { if (0 == i) { parentFolderId = GetTopLevelFolder(folders[i]); actualFolder = parentFolderId; } else { actualFolder = GetFolder(parentFolderId.Id, folders[i]); parentFolderId = actualFolder; } } return actualFolder; } private static bool RedirectionUrlValidationCallback(string redirectionUrl) { // The default for the validation callback is to reject the URL. bool result = false; Uri redirectionUri = new Uri(redirectionUrl); // Validate the contents of the redirection URL. In this simple validation // callback, the redirection URL is considered valid if it is using HTTPS // to encrypt the authentication credentials. if (redirectionUri.Scheme == "https") result = true; return result; } private static bool CertificateValidationCallBack(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { // If the certificate is a valid, signed certificate, return true. if (sslPolicyErrors == SslPolicyErrors.None) return true; // If there are errors in the certificate chain, look at each error to determine the cause. if ((sslPolicyErrors & SslPolicyErrors.RemoteCertificateChainErrors) == 0) { // In all other cases, return false. return false; } else { if (chain != null) { foreach (X509ChainStatus status in chain.ChainStatus) { if ((certificate.Subject == certificate.Issuer) && (status.Status == X509ChainStatusFlags.UntrustedRoot)) { // Self-signed certificates with an untrusted root are valid. } else { if (status.Status != X509ChainStatusFlags.NoError) { // If there are any other errors in the certificate chain, the certificate is invalid, // so the method returns false. return false; } } } } // When processing reaches this line, the only errors in the certificate chain are // untrusted root errors for self-signed certificates. These certificates are valid // for default Exchange server installations, so return true. return true; } } private Folder GetTopLevelFolder(string folderName) { FindFoldersResults findFolderResults = m_exchangeService.FindFolders(WellKnownFolderName.PublicFoldersRoot, new FolderView(int.MaxValue)); foreach (Folder folder in findFolderResults.Where(folder => folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase))) return folder; throw new Exception("Top Level Folder not found: " + folderName); } private Folder GetFolder(FolderId parentFolderId, string folderName) { FindFoldersResults findFolderResults = m_exchangeService.FindFolders(parentFolderId, new FolderView(int.MaxValue)); foreach (Folder folder in findFolderResults.Where(folder => folderName.Equals(folder.DisplayName, StringComparison.InvariantCultureIgnoreCase))) return folder; throw new Exception("Folder not found: " + folderName); } readonly ExchangeService m_exchangeService; } } 
0
source

All Articles