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

使用Microsoft Graph API /sendMail接口时遭遇访问拒绝错误求助

调用Outlook Graph API发送邮件时Access Denied错误的排查方案

核心原因及解决步骤

1. 应用权限配置错误或未完成管理员同意

你使用的是客户端凭证流(后台无用户交互模式),必须为Azure AD应用注册配置应用类型权限而非委托权限,且需完成管理员同意:

  • 所需权限:Mail.Send(应用权限)
  • 操作:
    • 进入Azure门户 → Azure AD → 应用注册 → 目标应用 → 权限管理 → 添加权限 → Microsoft Graph → 应用权限 → 搜索并勾选Mail.Send
    • 点击「授予管理员同意」,确保权限状态变为“已授予”

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:42:51