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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:07:19