通过Gmail REST API发送的草稿无法在新Gmail UI中打开
我之前踩过一模一样的坑,用Gmail REST API发送草稿后,发件人在新Gmail UI里打开已发送邮件就弹出"The conversation that you requested could not be loaded"的报错,但收件人不管用新UI还是旧UI都能正常看,切回旧UI自己也能打开,直到收到回复后新UI才突然能加载——完全和你描述的一致!
问题根源
这个bug本质是Gmail新UI对会话(Conversation)元数据的校验比旧UI严格得多。直接调用drafts.send只传draftId时,API没有完整生成新UI所需的会话关联字段,导致新UI无法正确解析这条会话。而当收件人回复后,Gmail后台会自动补全这些缺失的元数据,所以就能正常打开了。
亲测有效的解决方案
这里给你三个可行的解决办法,按推荐程度排序:
1. 发送草稿时携带完整的邮件内容
不要只传draftId,先通过GET https://www.googleapis.com/gmail/v1/users/me/drafts/<draftId>获取完整的草稿对象,然后把整个message字段也放到drafts.send的请求体里。示例请求体:
{ "id": "<你的draftId>", "message": { "raw": "<从草稿接口获取的raw内容>", "payload": {...}, "headers": [...], // 保留从draft接口返回的所有message字段 } }
这样API会重新处理完整的邮件结构,生成新UI需要的全部会话元数据,发送后直接在新UI里就能打开邮件。
2. 发送后主动触发元数据补全
调用drafts.send成功后,会返回已发送邮件的id,立刻用这个id调用GET https://www.googleapis.com/gmail/v1/users/me/messages/<messageId>获取邮件详情。哪怕你只是简单请求一下,Gmail后台都会自动补全会话的缺失字段,之后新UI就能正常加载了。
3. 改用users.messages.send接口发送
如果你的业务场景允许跳过草稿环节,直接用users.messages.send接口发送邮件(把草稿的内容作为raw字段传入),这种方式生成的邮件元数据是完整的,不会出现新UI加载失败的问题。
验证步骤
修改后按下面的流程测试:
- 在Gmail里撰写草稿(新/旧UI都行)
- 获取draftId并按新方式调用
drafts.send - 切换到新Gmail UI,打开已发送文件夹里的对应邮件,应该能正常加载了
内容的提问来源于stack exchange,提问作者john2x

