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执行此操作。

我试图找到一个很好的例子,但没有拿出一个。这应该指向你正确的方向。如果我找到任何东西,我会更新我的答案。

相关问题