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

Windows服务应用中调用Microsoft Graph API获取用户邮箱时遇ResourceNotFound错误求助

解决User not found错误的方案

嘿,你遇到的这个ResourceNotFound问题其实是个常见的小误用——你把应用注册的clientId当成用户标识传入graphClient.Users[]了!这个位置需要的是你要访问的目标用户的ID或者邮箱(UPN),而不是应用自身的clientId,咱们一步步来修正:

第一步:获取正确的用户标识

你需要先确定要读取哪个用户的收件箱,然后从Azure AD的用户详情页获取以下任一信息:

  • 用户的Object ID(在用户属性面板里可以找到)
  • 用户的UPN(通常就是用户的邮箱地址,比如user@yourcompany.com)

第二步:修正代码中的用户定位

把代码里的graphClient.Users[clientId]替换成正确的用户标识,比如:

// 用用户Object ID的示例
var targetUser = graphClient.Users["用户的Object ID字符串"];
// 或者用用户邮箱的示例
var targetUser = graphClient.Users["user@yourcompany.com"];

第三步:确认应用权限配置正确

因为你用的是ClientCredentialProvider(客户端凭据流),这种方式下应用是以自身身份访问资源,所以必须配置应用权限而非委托权限:

  1. 登录Azure门户,找到你的应用注册
  2. 进入“API权限”页面,点击“添加权限”
  3. 选择“Microsoft Graph” -> “应用权限”
  4. 添加Mail.Read权限(该权限已覆盖读取附件的需求)
  5. 一定要点击“授予管理员同意”,否则权限不会生效

修正后的完整代码示例

IConfidentialClientApplication clientApplication = ConfidentialClientApplicationBuilder
    .Create(clientId) // 这里注意你原代码里的ObjectId应该是clientId,确认参数对应正确
    .WithClientId(clientId)
    .WithTenantId(TenantID)
    .WithClientSecret(SecretValue)
    .Build();
var authProvider = new ClientCredentialProvider(clientApplication);
GraphServiceClient graphClient = new GraphServiceClient(authProvider);

// 替换成目标用户的Object ID或邮箱
IUserRequestBuilder targetUser = graphClient.Users["目标用户的Object ID或邮箱"];
var messages = await targetUser.MailFolders["Inbox"].Messages
    .Request()
    .Expand("attachments")
    .GetAsync();
foreach (var mssg in messages) {
    // 执行你的业务逻辑
}

额外提醒

  • 客户端凭据流不需要用户登录,所以应用必须有明确的应用权限,且获得租户管理员的同意才能访问用户邮箱
  • 确保目标用户属于你的Azure AD租户,否则应用可能没有访问权限

内容的提问来源于stack exchange,提问作者caradri3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:02:26