C#控制台应用调用Graph API发邮件报错:邮箱状态异常或本地托管
解决Microsoft Graph API发送邮件报错“The mailbox is either inactive, soft-deleted, or is hosted on-premise.”的方案
1. 确认目标邮箱的有效性
- 检查代码中
tenantName对应的邮箱(xx@xx.onmicrosoft.com)是否为活跃的Exchange Online邮箱:- 登录Microsoft 365管理中心,进入「用户>活动用户」,找到该用户,确认邮箱已创建、状态正常,未被禁用或软删除。
- 确保该邮箱不是本地Exchange服务器托管的,客户端凭据流仅支持Exchange Online邮箱。
2. 验证应用权限配置
- 从权限截图来看,已添加应用权限
Mail.Send,需确保:- 该权限已获得管理员同意(应用权限必须由全局管理员或Exchange管理员审批,状态显示为「已授予」才会生效)。
- 不要使用委派权限,客户端凭据流以应用身份运行,仅支持应用权限。
3. 验证用户与邮箱的可访问性
- 先调用Graph API的
GET /users/{tenantName}接口,确认用户存在且邮箱配置正常:var user = await graphServiceClient.Users[tenantName].GetAsync(); Console.WriteLine($"用户邮箱: {user.Mail}, 账户状态: {user.AccountEnabled}"); - 如果用户不存在或账户未启用,需先在Microsoft 365中完成用户与邮箱的创建配置。
4. 确认租户与用户的匹配性
- 确保代码中的
tenantId对应租户,就是tenantName所属的Microsoft 365租户,避免跨租户调用导致的权限异常。
5. 补充邮箱发送权限(可选)
- 如果租户有安全策略限制,应用可能需要额外的邮箱发送权限:
- 登录Exchange Online PowerShell,执行以下命令为应用分配
SendAs权限:Add-RecipientPermission -Identity "xx@xx.onmicrosoft.com" -Trustee "你的Azure应用显示名称" -AccessRights SendAs
- 登录Exchange Online PowerShell,执行以下命令为应用分配
内容的提问来源于stack exchange,提问作者Bas Nederveen
相关产品推荐
相关产品推荐

