2016-10-03 1 views
0

J'ai un dossier dans une boîte aux lettres Exchange qui est un enfant de la racine et qui est créé par l'utilisateur.Exchange Web Service FolderId pour un dossier créé par l'utilisateur

Comment trouver ce dossier à l'aide de l'API gérée par EWS?

J'ai essayé d'utiliser la traversée profonde mais je ne trouve pas le dossier.

Merci à l'avance

Edit: Voici le code que je utilise pour obtenir le dossier créé par l'utilisateur

ExchangeService server = new ExchangeService(ExchangeVersion.Exchange2007_SP1); 
server.UseDefaultCredentials = true; 
string configUrl = @"https://yourServerAddress.asmx"; 
server.Url = new Uri(configUrl); 
//SetView 
FolderView view = new FolderView(100); 
view.PropertySet = new PropertySet(BasePropertySet.IdOnly); 
view.PropertySet.Add(FolderSchema.DisplayName); 
view.Traversal = FolderTraversal.Deep; 
FindFoldersResults findFolderResults = server.FindFolders(WellKnownFolderName.Root, view); 
//find specific folder 
foreach(Folder f in findFolderResults) 
{ 
     //show folderId of the folder "test" 
     if (f.DisplayName == "Test") 
       Console.WriteLine(f.Id); 
} 
+0

Vous devriez commencer votre énumération à MsgFolderRoot plutôt que la racine, aussi parce que vous ne l'avez pas paginée les résultats que vous énumération renverrons seulement les 100 premiers dossiers dans une boîte aux lettres une boîte aux lettres typique peut contenir 1000+ dossier donc son important si vous voulez vous énumérer page les résultats. Il est facile d'utiliser un filtre de recherche et de filtrer les résultats, comme dans l'exemple que j'ai posté. –

+0

Mon énumération renvoie uniquement 25 dossiers pour MsgFolderRoot et 45 pour Root et les deux n'incluent pas les dossiers créés par les utilisateurs. Je vais essayer ce que vous avez suggéré. – tushar

Répondre

0

Vous devez inclure le code de votre utiliser dans votre question que vous probablement avoir un bug dans ça. Ce que je fais est d'utiliser une fonction pour trouver le dossier à partir d'un chemin de chaîne, alors vous pouvez simplement appeler cela comme GetFolderFromPath (service, « [email protected] », « \\ dossier1 \ Dossier2 ») par exemple

 internal static Folder GetFolderFromPath(ExchangeService service,String MailboxName,String FolderPath) 
    { 
     FolderId folderid = new FolderId(WellKnownFolderName.MsgFolderRoot,MailboxName); 
     Folder tfTargetFolder = Folder.Bind(service,folderid); 
     PropertySet psPropset = new PropertySet(BasePropertySet.FirstClassProperties); 
     String[] fldArray = FolderPath.Split('\\'); 
     for (Int32 lint = 1; lint < fldArray.Length; lint++) { 
      FolderView fvFolderView = new FolderView(1); 
      fvFolderView.PropertySet = psPropset; 
      SearchFilter SfSearchFilter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName,fldArray[lint]); 
      FindFoldersResults findFolderResults = service.FindFolders(tfTargetFolder.Id,SfSearchFilter,fvFolderView); 
      if (findFolderResults.TotalCount > 0){ 
      foreach(Folder folder in findFolderResults.Folders){ 
       tfTargetFolder = folder;     
       } 
      } 
      else{ 
       tfTargetFolder = null; 
       break; 
      }  
     } 
     if (tfTargetFolder != null) 
     { 
      return tfTargetFolder; 
     } 
     else 
     { 
      throw new Exception("Folder Not found"); 
     } 
    } 
+0

Merci Glen. Je vais essayer ce code pour obtenir les dossiers dont j'ai besoin – tushar

+0

Glen J'ai essayé ce code mais j'obtiens une erreur "Accès refusé" sur Folder.Bind. Savez-vous pourquoi cette erreur se produit et sa solution? – tushar

+0

Cela semble ne pas avoir les droits d'accès corrects à la boîte aux lettres sous-jacente. Assurez-vous d'accorder un accès complet à TargetMailbox en utilisant Add-MailboxPermissions, sinon le code ne fonctionnera pas. –

0

Apparemment, votre code est correct, mais il ne vous donnera pas accès au serveur d'échange. J'ai fait face au même problème et j'ai corrigé ces lignes seulement.

En fait MS ignore le UseDefaultCredentials = true;

peut être la raison pour laquelle vous ne serez pas connecté au serveur Exchange. Voir la documentation MS here pour plus de détails.

Utilisez cette approche

MSEWS.ExchangeService exchange = new MSEWS.ExchangeService(MSEWS.ExchangeVersion.Exchange2007_SP1); 
// userid , password and your network domain 
exchange.Credentials = new MSEWS.WebCredentials(userName, password, domain); 

exchange.AutodiscoverUrl("[email protected]");