使用Gmail API创建草稿设置其他收件人返回Delegation denied错误如何解决
问题原因
该Delegation denied403权限错误和收件人设置本身无关,核心是你调用Gmail API时的操作身份与目标操作资源不匹配,触发了跨账号操作的权限校验,常见诱因有3个:
- 调用
users.drafts.create接口时,userId参数误填为收件人邮箱,而非生成凭证的自有授权邮箱,系统判定你试图越权操作他人邮箱 - MimeMessage发件人设置错误,你代码中
message.setFrom(message.sender)的写法存在逻辑问题:刚初始化的MimeMessage的sender属性为null,相当于未明确指定发件人,系统误判你要以收件人身份创建草稿,触发委托权限校验 - 如果你使用服务账号鉴权,未开启Gmail API全域委托,也没有指定要模拟的授权用户邮箱,也会触发该错误
修复步骤
- 修正MimeMessage发件人配置,将发件人明确设置为你生成凭证的自有授权邮箱:
val props = Properties() val session = Session.getDefaultInstance(props, null) val message = MimeMessage(session) // 替换为你的授权邮箱地址,不要使用message.sender message.setFrom(InternetAddress("my.email.here@gmail.com")) message.addRecipient(JavaxMessage.RecipientType.TO, InternetAddress("different.email.here@gmail.com")) message.subject = subject
- 检查草稿创建接口的
userId参数,必须固定填me(代指当前授权身份)或者你的授权邮箱地址,不要填写收件人邮箱:
// 示例调用逻辑,核心注意第一个参数为"me" val draftContent = Draft().setMessage(Message().setRaw(encodeMimeMessageToBase64(message))) val result = gmailService.users().drafts().create("me", draftContent).execute()
- 若使用服务账号鉴权,需要额外完成两个配置:在Google Workspace管理后台为该服务账号开启Gmail API的全域委托权限;初始化Gmail客户端时明确指定要模拟的用户为你的授权自有邮箱。
- 如果你近期调整过API权限范围,需要重新走OAuth授权流程,获取新的访问令牌,旧令牌会保留之前的权限配置不会自动更新。
内容的提问来源于stack exchange,提问作者Augusto Carmo
相关产品推荐
相关产品推荐

