使用Microsoft Graph API /sendMail接口时遭遇访问拒绝错误求助
调用Outlook Graph API发送邮件时Access Denied错误的排查方案
核心原因及解决步骤
1. 应用权限配置错误或未完成管理员同意
你使用的是客户端凭证流(后台无用户交互模式),必须为Azure AD应用注册配置应用类型权限而非委托权限,且需完成管理员同意:
- 所需权限:
Mail.Send(应用权限) - 操作:
- 进入Azure门户 → Azure AD → 应用注册 → 目标应用 → 权限管理 → 添加权限 → Microsoft Graph → 应用权限 → 搜索并勾选
Mail.Send - 点击「授予管理员同意」,确保权限状态变为“已授予”
- 进入Azure门户 → Azure AD → 应用注册 → 目标应用 → 权限管理 → 添加权限 → Microsoft Graph → 应用权限 → 搜索并勾选
2. 令牌不包含所需权限
解析获取到的access_token,检查roles字段是否存在Mail.Send:
- 如果不存在,说明应用权限未正确配置或管理员同意未生效,重新执行权限配置和同意步骤
- 代码中可添加前置检查(需先安装
pyjwt包):import jwt if "access_token" in result: decoded_token = jwt.decode(result["access_token"], options={"verify_signature": False}) if "Mail.Send" not in decoded_token.get("roles", []): print("令牌缺少Mail.Send权限,请检查应用权限配置") exit()
3. 目标用户或邮箱问题
- 确认
userId是目标用户的正确Azure AD对象ID,或直接替换为用户邮箱(如https://graph.microsoft.com/v1.0/users/user@yourdomain.com/sendMail) - 确保目标用户邮箱处于正常状态,未被Exchange Online的安全政策限制第三方应用访问
4. 应用注册配置遗漏
检查应用注册是否启用了客户端密码(CLIENT_SECRET),且代码中的tenant_id、CLIENT_ID、CLIENT_SECRET均正确无误
代码优化点
在发送邮件前增加响应错误的详细输出,便于定位问题:
else: print("请求失败,错误详情:") print(f"状态码: {r.status_code}") print(r.json())
内容的提问来源于stack exchange,提问作者Tushar Patil
相关产品推荐
相关产品推荐

