如何将含图片的Google Docs模板以HTML格式原样通过邮件发送
问题背景
现有需求为将包含品牌logo、多张图片、文字说明的Google Docs模板,以与Docs内预览完全一致的效果通过邮件发送。目前已实现纯文本内容的邮件发送,无法完成带图片、带格式模板的邮件推送。
初始纯文本发送代码如下:
var body = doc.getBody().getText(); var message = body; var subject = "subject line"; MailApp.sendEmail(user.primaryEmail, subject, message)
参考方案调整后的脚本存在显示异常、图片无法加载的问题,代码如下:
function getDocAsHtml(docId){ var doc = DocumentApp.getActiveDocument() var url = "https://docs.google.com/feeds/download/documents/export/Export?exportFormat=html&id=" + doc.getId(); var html = UrlFetchApp.fetch(url, { headers: { authorization: "Bearer " + ScriptApp.getOAuthToken() } }).getContentText(); var body = doc.getBody().getText(); var message = body; var subject = "subject line"; MailApp.sendEmail('abc@xyz.com', subject, message, { htmlBody: html }); }
原因分析
直接导出的Docs原生HTML无法直接用于邮件发送,核心问题有三点:
- 导出代码中的图片源地址为Google Docs带权限校验的内部链接,收件人无文档访问权限时会直接显示裂图
- 原生导出HTML携带大量Docs专属冗余样式,和多数邮件客户端的渲染规则不兼容,会出现排版错位、格式丢失的问题
- 原调整后的脚本未对导出内容做适配处理,无法保证渲染一致性
可直接运行的修正代码
function sendFormattedDocEmail() { const doc = DocumentApp.getActiveDocument(); const docId = doc.getId(); // 导出文档为HTML格式 let htmlContent = UrlFetchApp.fetch( `https://docs.google.com/feeds/download/documents/export/Export?exportFormat=html&id=${docId}`, { headers: { authorization: `Bearer ${ScriptApp.getOAuthToken()}` } } ).getContentText(); // 内嵌所有图片为base64格式,无需权限即可加载 const imgMatchRegex = /<img[^>]+src="(https:\/\/[^">]+)"/g; let imgMatchRes; while ((imgMatchRes = imgMatchRegex.exec(htmlContent)) !== null) { const imgSrc = imgMatchRes[1]; try { const imgBlob = UrlFetchApp.fetch(imgSrc, { headers: { authorization: `Bearer ${ScriptApp.getOAuthToken()}` } }).getBlob(); const base64Str = Utilities.base64Encode(imgBlob.getBytes()); const mimeType = imgBlob.getContentType(); htmlContent = htmlContent.replace(imgSrc, `data:${mimeType};base64,${base64Str}`); } catch (err) { console.log(`单张图片处理失败,已跳过:${err.message}`); } } // 清理冗余样式,适配邮件客户端渲染规则 htmlContent = htmlContent .replace(/<style[^>]*>[\s\S]*?<\/style>/g, '') .replace(/class="[^"]*"/g, '') .replace(/id="[^"]*"/g, ''); // 邮件参数配置 const receiveAddr = 'abc@xyz.com'; // 替换为实际收件人邮箱 const mailSubject = 'subject line'; // 替换为实际邮件主题 const plainTextFallback = doc.getBody().getText(); // 纯文本兜底,兼容不支持HTML的邮件场景 // 发送邮件 MailApp.sendEmail(receiveAddr, mailSubject, plainTextFallback, { htmlBody: htmlContent, name: '发件人显示名称' // 可按需修改 }); }
使用说明
- 首次运行脚本时,根据弹窗提示完成权限授权即可,需要授权的范围包括文档访问、邮件发送、外部资源请求
- 如果文档内图片总体积过大,超过邮件服务商的单封邮件大小限制会导致发送失败,可提前压缩文档内图片
- 处理后的邮件会保留原文档的字体、段落、图片、排版格式,和Docs内预览效果一致,兼容主流邮箱客户端
内容的提问来源于stack exchange,提问作者ankit_dot
相关产品推荐
相关产品推荐

