使用EWS Managed API访问Exchange 2010共享联系人文件夹遇阻
解决EWS Managed API访问指定名称共享联系人文件夹的问题
我来帮你搞定这个访问自定义共享联系人文件夹的难题!先拆解下你遇到的问题,再给你可行的解决方案:
一、先说说之前ResolveName空指针异常的原因
你之前的代码里用了ResolveNameSearchLocation.DirectoryOnly,这个范围只搜索Exchange全局地址列表,要是你的lookupArr[0]不是完整邮箱地址/有效别名,或者目标用户不在全局地址列表里,就会返回空集合导致空指针。建议改成DirectoryAndContacts扩大搜索范围,同时加个非空判断:
NameResolutionCollection ncCol = service.ResolveName(lookupArr[0], ResolveNameSearchLocation.DirectoryAndContacts, true); // 先判断集合非空再用Count if (ncCol != null && ncCol.Count > 0) { // 后续逻辑 }
二、核心问题:如何获取名为"CheckForDuplicates"的共享联系人文件夹
你之前绑定的WellKnownFolderName.Contacts是目标邮箱的默认联系人文件夹,而自定义的共享文件夹需要通过搜索或遍历目标邮箱的文件夹树来定位。以下是两种可靠方法:
方法1:通过邮箱地址+文件夹名称搜索(推荐)
这种方法不需要提前知道文件夹ID,只要你有权限访问目标邮箱,就能直接搜索指定名称的文件夹:
// 替换成共享联系人文件夹所属的邮箱地址 string sharedMailboxAddress = "shared_user@yourdomain.com"; Mailbox targetMailbox = new Mailbox(sharedMailboxAddress); // 获取目标邮箱的根文件夹,用来搜索子文件夹 Folder rootFolder = Folder.Bind(service, new FolderId(WellKnownFolderName.Root, targetMailbox)); // 创建搜索条件:查找名为"CheckForDuplicates"的文件夹 SearchFilter folderFilter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "CheckForDuplicates"); FolderView folderView = new FolderView(10) { Traversal = FolderTraversal.Deep, // 递归搜索所有子文件夹 PropertySet = new PropertySet(BasePropertySet.IdOnly, FolderSchema.DisplayName) }; FindFoldersResults foundFolders = rootFolder.FindFolders(folderFilter, folderView); if (foundFolders.Count > 0) { Folder targetSharedFolder = Folder.Bind(service, foundFolders[0].Id); Console.WriteLine($"成功找到共享文件夹:{targetSharedFolder.DisplayName}"); // 现在可以读取该文件夹下的联系人了 ItemView contactView = new ItemView(100); FindItemsResults<Item> contacts = targetSharedFolder.FindItems(contactView); foreach (Item item in contacts) { if (item is Contact contact) { // 提取你需要的信息:姓名、邮箱等 Console.WriteLine($"姓名:{contact.GivenName} {contact.Surname},邮箱:{contact.EmailAddresses[EmailAddressKey.EmailAddress1]}"); } } } else { Console.WriteLine("未找到指定名称的共享文件夹,请检查名称拼写或权限"); }
方法2:直接通过文件夹EntryId绑定(适合已知ID的场景)
如果你能从Outlook里获取到目标文件夹的EntryId(可以通过Outlook的属性查看功能导出),可以直接绑定:
// 替换成目标文件夹的EntryId string folderEntryId = "你的共享文件夹EntryId"; FolderId targetFolderId = new FolderId(folderEntryId, new Mailbox("shared_user@yourdomain.com")); Folder targetSharedFolder = Folder.Bind(service, targetFolderId);
三、关键前提:确认权限设置
一定要确保共享文件夹的所有者已经给你授予了至少读取权限:
- 对方可以在Outlook里右键点击"CheckForDuplicates"文件夹 → 权限 → 添加你的邮箱,设置读取权限
- 或者通过Exchange管理控制台/Exchange Admin Center给你分配该文件夹的权限
内容的提问来源于stack exchange,提问作者mypsi
相关产品推荐
相关产品推荐

