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
相关产品推荐
相关产品推荐

