如何使用Exchange Web Services 2010托管API获取文件夹大小?

我正在尝试使用EWS 2010托管API来获取用户邮箱的总大小。 我还没有找到一个Web服务方法来获取这些数据,所以我想我会尝试计算它。 我在另一个网站上找到了一个关于使用EWS 2007查找邮箱大小的看似适用的问题,但要么我不理解它要求我做什么,要么该方法不适用于EWS 2010。

在代码洞察中,我能够编写我认为是一种递归遍历文件夹结构并导致收件箱内所有文件夹的总计的方法:

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

但抛出了Null引用exception,主要是说[folder].ManagedFolderInformation是一个空对象引用。

为清楚起见,我还试图获得根文件夹的大小:

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

其中引发了相同的NREexception,所以我知道一旦你到达目录树中的某个深度,ManagedFolderInformation就不存在了。

有关如何获取用户邮箱总大小的任何想法? 我吠叫错了树吗?

使用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); } } 

第一个链接是你想要的方式。 该post描述了默认文件夹不被视为“托管文件夹”,这就是您在某些文件夹的ManagedFolderInformation属性上获取NRE的原因。

post建议的是在文件夹请求中添加扩展属性。 以下是有关如何使用Managed API执行此操作的MSDN页面 。

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