使用Gmail API的users.messages.get()解码邮件失败求助
问题描述
- 使用Google Apps Script调用Gmail API的
users.messages.get()接口读取Gmail邮件,持有有效的邮件ID,代码片段如下:
let message = Gmail.Users.Messages.get("me", id); let encodedBody = message["payload"]["parts"][0]["body"]["data"]; let body = Utilities.base64Decode(encodedBody);
- 按官方文档说明,
encodedBody应为Base64编码字符串,在文档的「Try this method」功能中确实能得到可正常解码的字符串,但运行Google Apps Script时抛出异常:Exception: Could not decode string. - 查看控制台发现
encodedBody是如下形式的整数数组:[60,33,68,79,67,84,89,80,69,32,104,116,109...] - 由于相关问题的原因,无法使用
GmailApp.search().getMessages()方法。
原因分析
Google Apps Script的高级Gmail服务与直接调用REST API的返回格式存在差异:REST API返回的body.data是Base64编码字符串,但高级服务会自动将该字段解析为Uint8Array(整数数组),而非保留原始字符串格式。因此直接调用Utilities.base64Decode()会报错,因为该方法要求传入字符串类型的参数,而非数组。
可用代码示例
以下是两种可行的读取Gmail邮件正文的实现方式:
方式1:将整数数组转换为Base64字符串后解码
function getGmailBodyById(messageId) { // 获取邮件详情 const message = Gmail.Users.Messages.get("me", messageId); // 提取正文数据的整数数组 const bodyData = message.payload.parts[0].body.data; // 将Uint8Array转换为Base64字符串 const base64Str = Utilities.base64Encode(bodyData); // 解码为Blob并转换为文本(根据邮件实际MIME类型调整,示例为HTML) const decodedBlob = Utilities.newBlob(Utilities.base64Decode(base64Str), "text/html"); const bodyContent = decodedBlob.getDataAsString(); Logger.log(bodyContent); return bodyContent; }
方式2:直接从整数数组创建Blob获取文本(更高效)
function getGmailBodyById(messageId) { // 获取邮件详情 const message = Gmail.Users.Messages.get("me", messageId); // 提取正文数据的整数数组 const bodyData = message.payload.parts[0].body.data; // 直接用整数数组创建Blob,指定正确的MIME类型 const blob = Utilities.newBlob(bodyData, "text/html"); const bodyContent = blob.getDataAsString(); Logger.log(bodyContent); return bodyContent; }
关键注意事项
- 邮件结构适配:部分邮件的正文可能直接存放在
payload.body.data而非payload.parts[0].body.data(比如纯文本邮件、无附件的邮件),需根据实际邮件结构调整路径。 - MIME类型匹配:需根据邮件的
mimeType字段指定正确的类型,常见类型包括text/html(HTML格式)和text/plain(纯文本格式)。
内容的提问来源于stack exchange,提问作者Hard Mode
相关产品推荐
相关产品推荐

