You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:52:43