将Google Docs以带图HTML格式发送至邮件正文失效求助
解决Google Docs导出HTML邮件图片无法正常显示的问题
之前用以下代码可将Google Docs的HTML内容(含格式化文本和图片)正常展示在邮件正文,但近期图片出现显示异常:要么为空,要么直接显示base64编码内容,还会阻塞文档其他内容。
原代码:
function sendGoogleDocAsHTML() { var docId = "GOOGLE_DOCS_ID"; var destinatario = "xxxxxx@gmail.com"; var oggetto = "SUBJECT"; var url = "https://docs.google.com/document/d/" + docId + "/export?format=html"; var param = { method : "get", headers : { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, muteHttpExceptions:true, }; var html = UrlFetchApp.fetch(url, param); var raw = Utilities.base64EncodeWebSafe("Subject: " + oggetto + "\r\n" + "To: " + destinatario + "\r\n" + "Content-Type: text/html; charset=UTF-8\r\n\r\n" + html+"\r\n\r\n"); var message = Gmail.newMessage(); message.raw = raw; var sentMsg = Gmail.Users.Messages.send(message, 'me'); }
异常示例:
<img alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/...
解决方案
问题根源是Google Docs导出的HTML中图片使用base64 Data URI,部分邮件客户端对这种格式支持不佳,且大体积base64会导致渲染异常。我们需要将base64图片转为邮件附件,通过CID引用在正文中显示。
修改后的代码:
function sendGoogleDocAsHTMLWithImages() { var docId = "GOOGLE_DOCS_ID"; var destinatario = "xxxxxx@gmail.com"; var oggetto = "SUBJECT"; // 导出Google Docs为HTML var url = "https://docs.google.com/document/d/" + docId + "/export?format=html"; var param = { method: "get", headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, muteHttpExceptions: true, }; var htmlContent = UrlFetchApp.fetch(url, param).getContentText(); // 提取并处理所有base64图片 var attachments = []; var cidCounter = 1; // 匹配所有base64图片标签 htmlContent = htmlContent.replace(/<img[^>]+src="data:image\/([^;]+);base64,([^"]+)"/g, function(match, imageType, base64Data) { // 将base64转为Blob var blob = Utilities.newBlob(Utilities.base64Decode(base64Data), "image/" + imageType, "image_" + cidCounter + "." + imageType); // 生成唯一CID var cid = "image" + cidCounter + "@example.com"; cidCounter++; // 添加到附件列表 attachments.push({blob: blob, cid: cid}); // 替换src为CID引用 return match.replace(/src="[^"]+"/, 'src="cid:' + cid + '"'); }); // 发送邮件:使用GmailApp更简便处理带CID的附件 GmailApp.sendEmail( destinatario, oggetto, "请使用支持HTML的邮件客户端查看此邮件", // 纯文本降级内容 { htmlBody: htmlContent, attachments: attachments.map(att => att.blob), inlineImages: attachments.reduce((obj, att) => { obj[att.cid] = att.blob; return obj; }, {}) } ); }
关键改动说明
- 解析HTML中的base64图片,将其转换为Blob对象作为邮件附件
- 为每个图片生成唯一的CID(Content-ID),替换原HTML中图片的src为
cid:xxx格式 - 使用
GmailApp.sendEmail替代原Gmail API的raw方式,内置支持inline图片的CID引用,避免手动构造raw邮件的编码问题
内容的提问来源于stack exchange,提问作者Michele Pisani
相关产品推荐
相关产品推荐

