使用Gmail API发送回复草稿时触发「Invalid draft」错误求助
解决Gmail API发送草稿时的「Invalid draft」错误及GmailApp回复问题
错误原因分析
raw与payload字段冲突:Gmail API创建消息时,raw(完整MIME编码内容)和payload(结构化消息内容)是互斥属性,不能同时指定。你的代码同时包含这两个字段,直接导致草稿格式不合法。raw内容格式错误:raw要求是完整的MIME邮件内容(必须包含From、To、Subject、Content-Type等核心邮件头)经过Base64编码后的字符串,而你仅传入了纯文本内容,缺少邮件必需的结构信息。- 发送草稿的参数顺序错误:
Gmail.Users.Drafts.send()的正确参数顺序是userId在前,随后是包含草稿ID的对象,原代码参数顺序颠倒也会触发错误。
解决方案一:修复Gmail API草稿创建及发送代码
方式1:使用raw字段构造完整MIME邮件
手动构造符合标准的MIME内容,再进行编码:
var thread = GmailApp.getThreadById(existingThreadId); var messages = thread.getMessages(); var originalMessage = messages[0]; var recipientEmail = originalMessage.getTo(); var senderEmail = Session.getActiveUser().getEmail(); var subject = "Re: " + originalMessage.getSubject(); // 构造完整MIME邮件内容,头信息与正文用空行分隔 var mimeContent = [ "From: " + senderEmail, "To: " + recipientEmail, "Subject: " + subject, "Content-Type: text/plain; charset=utf-8", "", "Test Test Test" ].join("\n"); // 创建草稿,仅保留raw字段 var draftReplyRequestBody = { message: { threadId: existingThreadId, raw: Utilities.base64EncodeWebSafe(mimeContent) } }; var draftReplyResponse = Gmail.Users.Drafts.create(draftReplyRequestBody, "me"); var draftReplyId = draftReplyResponse.id; // 修正参数顺序后发送草稿 Gmail.Users.Drafts.send("me", {id: draftReplyId});
方式2:使用payload字段构造结构化消息
无需手动处理MIME格式,直接用结构化字段构建消息:
var thread = GmailApp.getThreadById(existingThreadId); var messages = thread.getMessages(); var originalMessage = messages[0]; var recipientEmail = originalMessage.getTo(); var senderEmail = Session.getActiveUser().getEmail(); var subject = "Re: " + originalMessage.getSubject(); var draftReplyRequestBody = { message: { threadId: existingThreadId, payload: { headers: [ {name: "From", value: senderEmail}, {name: "To", value: recipientEmail}, {name: "Subject", value: subject} ], mimeType: "text/plain", body: { data: Utilities.base64EncodeWebSafe("Test Test Test") } } } }; var draftReplyResponse = Gmail.Users.Drafts.create(draftReplyRequestBody, "me"); var draftReplyId = draftReplyResponse.id; // 发送草稿 Gmail.Users.Drafts.send("me", {id: draftReplyId});
解决方案二:正确使用GmailApp方法回复线程
你提到GmailApp方法只会回复给自己,大概率是因为原始消息的getTo()返回的是你自身邮箱(比如这条消息是你发送给他人的)。根据需求选择对应方法:
- 回复线程所有参与者:
var thread = GmailApp.getThreadById(existingThreadId); thread.replyAll("Test Test Test");
- 仅回复原始消息的发件人:
var thread = GmailApp.getThreadById(existingThreadId); var originalMessage = thread.getMessages()[0]; originalMessage.reply("Test Test Test");
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

