EWS 获取所有联系人,包括位于联系人文件夹之外的联系人
EWS Get all contacts including located outside Contacts folder
我正在使用 Microsoft.Exchange.WebServices 2.2.0 实现适配器。我坚持:
场景:获取所有联系人(甚至那些 created/moved 在联系人文件夹 (WellKnownFolderName.Contacts) 之外的联系人)。
List<Contact> result = new List<Contact>();
FindFoldersResults allFolders = _service.FindFolders(WellKnownFolderName.Root, new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep }); // Getting all folders
foreach (var folder in allFolders) // loop thru all folders
{
SearchFilter.IsEqualTo contactSchemaFilter = new SearchFilter.IsEqualTo(ItemSchema.ItemClass, "Microsoft.Exchange.WebServices.Data.ContactSchema");
FindItemsResults<Item> discoveredContactsInFolder = _service.FindItems(folder.Id, contactSchemaFilter, new ItemView(int.MaxValue)); // find all items which has same Schema as Contacts.
result = discoveredContactsInFolder.Select(c => c as Contact).ToList();
}
我的问题:除了我要查找的联系人外,我还在获取全局地址列表和联系人组。
问:我是否缺少任何过滤器或完全不同的方法?
此致,
SVG
首先,对于您的代码,您应该对 FindFolder 和 FindItems 都进行分页 https://msdn.microsoft.com/en-us/library/office/dn592093(v=exchg.150).aspx 您的示例的问题是,如果您有更多的 1000 个文件夹或 1000 个联系人,因为 Exchange 的节流方式将不会进程
SearchFilter.IsEqualTo contactSchemaFilter = new SearchFilter.IsEqualTo(ItemSchema.ItemClass, "Microsoft.Exchange.WebServices.Data.ContactSchema");
ItemClass 属性 是 ContentClass https://msdn.microsoft.com/en-us/library/aa125194(v=exchg.65).aspx 所以对于 Contacts 这将是
IPM.Contact
联系人组的 ItemClass 为 IPM.DistList
FindFoldersResults allFolders = _service.FindFolders(WellKnownFolderName.Root, new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep }); // Getting all folders
我建议您在 MsgFolderRoot 开始搜索使用 Root 的问题是这考虑了邮箱中的 NON_IPM_Subtree,其中包括所有系统文件夹,因此将包含大量缓存(例如 GAL 条目ETC)。因为 NON_IPM_Subtree 对用户不可见,所以这些文件夹中不应有用户创建的联系人。
我正在使用 Microsoft.Exchange.WebServices 2.2.0 实现适配器。我坚持:
场景:获取所有联系人(甚至那些 created/moved 在联系人文件夹 (WellKnownFolderName.Contacts) 之外的联系人)。
List<Contact> result = new List<Contact>();
FindFoldersResults allFolders = _service.FindFolders(WellKnownFolderName.Root, new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep }); // Getting all folders
foreach (var folder in allFolders) // loop thru all folders
{
SearchFilter.IsEqualTo contactSchemaFilter = new SearchFilter.IsEqualTo(ItemSchema.ItemClass, "Microsoft.Exchange.WebServices.Data.ContactSchema");
FindItemsResults<Item> discoveredContactsInFolder = _service.FindItems(folder.Id, contactSchemaFilter, new ItemView(int.MaxValue)); // find all items which has same Schema as Contacts.
result = discoveredContactsInFolder.Select(c => c as Contact).ToList();
}
我的问题:除了我要查找的联系人外,我还在获取全局地址列表和联系人组。
问:我是否缺少任何过滤器或完全不同的方法?
此致, SVG
首先,对于您的代码,您应该对 FindFolder 和 FindItems 都进行分页 https://msdn.microsoft.com/en-us/library/office/dn592093(v=exchg.150).aspx 您的示例的问题是,如果您有更多的 1000 个文件夹或 1000 个联系人,因为 Exchange 的节流方式将不会进程
SearchFilter.IsEqualTo contactSchemaFilter = new SearchFilter.IsEqualTo(ItemSchema.ItemClass, "Microsoft.Exchange.WebServices.Data.ContactSchema");
ItemClass 属性 是 ContentClass https://msdn.microsoft.com/en-us/library/aa125194(v=exchg.65).aspx 所以对于 Contacts 这将是
IPM.Contact
联系人组的 ItemClass 为 IPM.DistList
FindFoldersResults allFolders = _service.FindFolders(WellKnownFolderName.Root, new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep }); // Getting all folders
我建议您在 MsgFolderRoot 开始搜索使用 Root 的问题是这考虑了邮箱中的 NON_IPM_Subtree,其中包括所有系统文件夹,因此将包含大量缓存(例如 GAL 条目ETC)。因为 NON_IPM_Subtree 对用户不可见,所以这些文件夹中不应有用户创建的联系人。