使用EWS从Outlook获取用户时返回空集合的问题求助
EWS获取Outlook全局用户为空集合的解决方案
先排查配置层面的潜在问题
- 权限验证:确保你的应用已在Azure AD中添加
EWS.AccessAsUser.All权限(应用或委托权限均可,需管理员授予同意),且目标共享邮箱已被授予ApplicationImpersonation权限给你的应用。 - 令牌有效性:用JWT解码工具检查OAuth令牌,确认包含
EWS.AccessAsUser.All的Scope,且令牌未过期。 - 邮箱地址正确性:确认
ImpersonatedUserId和X-AnchorMailbox的SMTP地址格式正确(如example@domain.com,避免示例中的example@com格式错误)。
修正FindPeople方法(解决无结果问题)
你之前的代码错误地查询了个人联系人文件夹,而要获取全局地址列表(GAL)的所有用户,需要指向WellKnownFolderName.Directory,同时使用PersonaSchema而非ContactSchema:
// 目标改为全局地址列表 var galFolder = new FolderId(WellKnownFolderName.Directory); // 过滤条件:匹配带@的邮箱地址(可根据需求调整) var searchFilter = new SearchFilter.ContainsSubstring(PersonaSchema.EmailAddresses, "@"); // EWS服务限制单次最多返回1000条,需分页获取 var itemView = new ItemView(1000); FindPeopleResults results; do { results = exchangeService.FindPeople(galFolder, searchFilter, itemView); // 处理当前页的用户数据 foreach (var persona in results.People) { // 示例:获取用户名和邮箱 Console.WriteLine($"{persona.DisplayName}: {persona.EmailAddresses.FirstOrDefault()?.Address}"); } // 更新分页偏移,继续获取下一页 itemView.Offset += results.People.Count; } while (results.MoreAvailable);
解决ResolveName的100条限制
ResolveName默认返回100条,但可通过设置最大返回数(上限为1000)调整,适合获取1000条以内的用户:
var resolveResults = exchangeService.ResolveName( "", ResolveNameSearchLocation.DirectoryOnly, true, new PropertySet(BasePropertySet.FirstClassProperties), 1000);
若需获取超过1000条的所有用户,优先使用上面的FindPeople分页方案。
额外注意事项
- 若使用应用权限而非委托权限访问共享邮箱,无需设置
ImpersonatedUserId,仅保留X-AnchorMailbox指向共享邮箱地址即可。 - 避免使用
int.MaxValue作为页大小,会触发EWS服务的限制,建议固定为1000。
内容的提问来源于stack exchange,提问作者MOMO
相关产品推荐
相关产品推荐

