4

J'essaie d'utiliser l'API gérée EWS 2010 pour obtenir la taille totale de la boîte aux lettres d'un utilisateur. Je n'ai pas trouvé de méthode de service Web pour obtenir ces données, alors j'ai pensé que j'essaierais de le calculer. J'ai trouvé une question apparemment applicable sur un autre site au sujet de finding mailbox sizes with EWS 2007, mais soit je ne comprends pas ce que cela me demande de faire, soit cette méthode ne marche pas avec EWS 2010.Comment obtenir la taille de dossier avec l'API gérée Exchange Web Services 2010?

Noodling dans le code, Je suis capable d'écrire ce que je pensais était une méthode qui traverserait la structure des dossiers récursive et au total combiné de tous les dossiers dans la boîte de réception:

private int traverseChildFoldersForSize(Folder f) 
{ 
    int folderSizeSum = 0; 
    if (f.ChildFolderCount > 0) 
    { 
     foreach (Folder c in f.FindFolders(new FolderView(10000))) 
     { 
      folderSizeSum += traverseChildFoldersForSize(c); 
     } 
    } 

    folderSizeSum += (int)f.ManagedFolderInformation.FolderSize; 

    return folderSizeSum; 
} 

(Suppose il n'y a pas plus de 10.000 dossiers à l'intérieur d'un dossier donné Figure qui est un pari sûr ...)

Malheureusement, cela ne fonctionne pas.

J'initiant la récursion avec ce code:

Folder root = Folder.Bind(svc, WellKnownFolderName.Inbox); 
int totalSize = traverseChildFoldersForSize(root); 

Mais une exception référence nulle est jeté, dit essentiellement que [folder].ManagedFolderInformation est une référence d'objet nul.

Pour plus de clarté, j'ai aussi tenté d'obtenir exactement la taille du dossier racine:

Console.Write(root.ManagedFolderInformation.FolderSize.ToString()); 

qui a lancé la même exception NRE, donc je sais que ce n'est pas seulement qu'une fois que vous arrivez à une certaine profondeur dans l'arborescence de répertoires que ManagedFolderInformation n'existe pas.

Des idées sur la façon d'obtenir la taille totale de la boîte aux lettres de l'utilisateur? Est-ce que j'aboie le mauvais arbre?

Répondre

8

Utilisation du serveur Web intégré Managad APi, vous pouvez utiliser ce code pour obtenir la taille du dossier cumulatif d'une boîte aux lettres:

internal class Program 
{ 
    private static readonly ExtendedPropertyDefinition PidTagMessageSizeExtended = new ExtendedPropertyDefinition(0xe08, 
                                MapiPropertyType 
                                .Long); 

    public static void Main(string[] args) 
    { 
     var service = new ExchangeService(ExchangeVersion.Exchange2010_SP1) 
         {Credentials = new NetworkCredential("mail", "pw!")}; 

     service.AutodiscoverUrl("mail", url => true); 

     var offset = 0; 
     const int pagesize = 12; 
     long size = 0; 

     FindFoldersResults folders; 
     do 
     { 
      folders = service.FindFolders(WellKnownFolderName.MsgFolderRoot, 
              new FolderView(pagesize, offset, OffsetBasePoint.Beginning) 
              { 
              Traversal = FolderTraversal.Deep, 
              PropertySet = 
               new PropertySet(BasePropertySet.IdOnly, PidTagMessageSizeExtended, 
                   FolderSchema.DisplayName) 
              }); 
      foreach (var folder in folders) 
      { 
       long folderSize; 
       if (folder.TryGetProperty(PidTagMessageSizeExtended, out folderSize)) 
       { 
        Console.Out.WriteLine("{0}: {1:00.00} MB", folder.DisplayName, folderSize/1048576); 
        size += folderSize; 
       } 
      } 
      offset += pagesize; 
     } while (folders.MoreAvailable); 
     Console.Out.WriteLine("size = {0:0.00} MB", size/1048576); 
    } 
} 
+0

vous avez sauvé ma journée, mais votre byteformating isnt parfait, utilisez ceci: ' statique double ConvertBytesToMb (longs octets) { \t return (octets/1024f)/1024f; } ' – jwillmer

1

Le premier lien est la façon dont vous voulez aller. Le message décrit que les dossiers par défaut ne sont pas considérés comme des «dossiers gérés», ce qui explique pourquoi vous obtenez le NRE dans la propriété ManagedFolderInformation pour certains dossiers.

Ce que le message suggère est d'ajouter une propriété étendue à la demande pour les dossiers. Here's the MSDN page sur la façon de le faire en utilisant l'API Managed.

J'ai essayé de trouver un bon exemple mais je n'en ai pas trouvé un. Cela devrait vous indiquer la bonne direction. Si je trouve quelque chose, je mettrai à jour ma réponse.

Questions connexes