4

我正在嘗試使用EWS 2010託管API來獲取用戶郵箱的總大小。我還沒有找到一個Web服務方法來獲取這些數據,所以我想我會試着去計算它。我在另一個網站上發現了一個關於finding mailbox sizes with EWS 2007的看似適用的問題,但要麼我不理解它要求我做什麼,要麼這種方法不適用於EWS 2010.如何獲取Exchange Web Services 2010託管API的文件夾大小?

在代碼洞察中,我能寫什麼,我的想法是,將遞歸遍歷文件夾結構,並導致總共爲收件箱中的所有文件夾的方法:

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; 
} 

(假設有一個內不超過10,000個文件夾這是一個安全的賭注......)

不幸的是,這是行不通的。

我開始使用此代碼遞歸:

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

但一個空引用異常被拋出,基本上說[folder].ManagedFolderInformation是一個空對象引用。

爲清楚起見,我也試圖剛剛得到的根文件夾的大小:

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

哪個扔相同NRE異常,所以我知道這不僅僅是因爲一旦你到了一定深度ManagedFolderInformation不存在的目錄樹。

有關如何獲取用戶郵箱總大小的任何想法?我吠叫錯了樹嗎?

回答

8

使用EWS Managad API,您可以使用此代碼來獲取郵箱的累計文件夾大小:

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

你救了我的一天,但你的byteformating isn't完美的,使用此: '靜態雙倍ConvertBytesToMb(長字節) { \t return(bytes/1024f)/ 1024f; }' – jwillmer 2012-02-14 15:55:53

1

第一個鏈接是你想要的方式。該文章描述了默認文件夾不被視爲「託管文件夾」,這就是爲什麼您要獲取某些文件夾的ManagedFolderInformation屬性的NRE。

這篇文章的建議是將擴展屬性添加到文件夾的請求。 Here's the MSDN page關於如何使用託管API執行此操作。

我試圖找到一個很好的例子,但沒有拿出一個。這應該指向你正確的方向。如果我找到任何東西,我會更新我的答案。

相關問題