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

Gmail插件Compose Trigger无法获取邮件主题、正文及附件问题

解决方案:在Gmail插件Compose Trigger中获取草稿的主题、正文和附件

我完全懂你的困扰——Compose Trigger的event对象确实只提供draftMetadata,而且默认只有收件人信息,这是Gmail插件的设计逻辑决定的:Compose Trigger针对的是草稿状态的邮件,这类邮件还未成为正式的“消息”(Message),所以无法直接访问对应正式邮件的messageMetadata。

不过我们可以通过Gmail API来获取草稿的完整内容,具体步骤如下:

1. 配置必要的OAuth权限

首先需要在你的appscript.json中添加Gmail API的访问权限,否则无法调用API获取草稿详情。修改oauthScopes数组,添加以下权限之一:

  • 仅读取草稿:"https://www.googleapis.com/auth/gmail.readonly"
  • 读写草稿:"https://www.googleapis.com/auth/gmail.modify"

示例appscript.json的权限部分:

"oauthScopes": [
  "https://www.googleapis.com/auth/gmail.addons.execute",
  "https://www.googleapis.com/auth/gmail.readonly"
]

2. 修改composeTrigger函数,通过Gmail API获取完整草稿数据

event.draftMetadata其实包含一个draftId字段,我们可以用它调用Gmail.Drafts.get()方法获取草稿的全部信息,包括主题、正文和附件。以下是完整的示例代码:

function composeTrigger(event) {
  const draftId = event.draftMetadata.draftId;
  
  if (!draftId) {
    Logger.info("无法获取草稿ID,可能是草稿尚未保存");
    return;
  }

  // 调用Gmail API获取完整草稿
  const draft = Gmail.Drafts.get(draftId);
  const message = draft.message;

  // 提取邮件主题
  const subjectHeader = message.payload.headers.find(header => header.name === "Subject");
  const subject = subjectHeader ? subjectHeader.value : "无主题";

  // 提取邮件正文(处理纯文本和HTML两种格式)
  let bodyContent = "";
  const payload = message.payload;

  if (payload.mimeType === "text/plain") {
    // 纯文本格式直接解码
    bodyContent = Utilities.newBlob(
      Utilities.base64Decode(payload.body.data, Utilities.Charset.UTF_8)
    ).getDataAsString();
  } else if (payload.mimeType.startsWith("multipart/")) {
    // 多部分格式,优先提取纯文本,没有则用HTML
    const textPart = payload.parts.find(part => part.mimeType === "text/plain");
    const htmlPart = payload.parts.find(part => part.mimeType === "text/html");
    
    if (textPart) {
      bodyContent = Utilities.newBlob(
        Utilities.base64Decode(textPart.body.data, Utilities.Charset.UTF_8)
      ).getDataAsString();
    } else if (htmlPart) {
      bodyContent = Utilities.newBlob(
        Utilities.base64Decode(htmlPart.body.data, Utilities.Charset.UTF_8)
      ).getDataAsString();
    }
  }

  // 提取附件信息(文件名、类型、大小,如需内容可进一步解码)
  const attachments = payload.parts
    .filter(part => part.filename && part.filename !== "")
    .map(part => ({
      name: part.filename,
      mimeType: part.mimeType,
      size: part.body.size
      // 如需获取附件内容,可使用 Utilities.base64Decode(part.body.data)
    }));

  // 打印获取到的信息
  Logger.info(`邮件主题:${subject}`);
  Logger.info(`邮件正文:${bodyContent}`);
  Logger.info(`附件列表:${JSON.stringify(attachments)}`);
}

注意事项

  • 草稿保存状态:如果用户刚打开撰写窗口还未输入任何内容,可能暂时没有draftId,所以代码里加了判断逻辑。
  • 正文解码:Gmail API返回的内容是Base64编码的,必须用Utilities.base64Decode解码才能得到可读文本。
  • 权限审核:当你部署插件时,Google会审核你请求的权限,确保权限范围与插件功能匹配。

内容的提问来源于stack exchange,提问作者SanketDG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:50:39