向HTML模板传递HTML内容时标签转义问题及解决方案咨询
解决Google Apps Script HTML模板传递HTML字符串被转义的问题
问题根源
用<?= someVariable ?>输出变量时,HtmlService会自动转义HTML实体(<变成<,>变成>),这本来是防XSS的安全机制,但会导致你传入的HTML格式字符串没法正常渲染,又因为邮件客户端不支持JS,没法用前端方法反转义。
直接解决方案:用不转义的输出语法
把HTML模板里的<?= items ?>改成<?!= items ?>——这个语法会直接输出原始HTML内容,完全不做转义处理,刚好适配邮件场景。
代码示例
.gs 文件代码
function sendHtmlEmail() { // 构造你要传递的HTML格式内容 const items = '<div><h3>测试标题</h3><p>这是带<b>加粗</b>的段落内容</p></div>'; // 创建模板并赋值 const template = HtmlService.createTemplateFromFile('emailTemplate'); template.items = items; // 生成最终的HTML内容(这里不会转义items里的标签) const htmlContent = template.evaluate().getContent(); // 发送邮件(示例) GmailApp.sendEmail({ to: 'target@example.com', subject: 'HTML内容测试', htmlBody: htmlContent }); }
HTML模板文件(命名为emailTemplate.html)
<!DOCTYPE html> <html> <body> <h1>邮件主标题</h1> <!-- 用<?!= 直接输出原始HTML --> <?!= items ?> </body> </html>
安全提醒
- 只有当
items的内容是完全可信的(比如你自己生成的HTML,不是用户输入的内容),才用<?!= ?>,不然可能引入XSS风险,恶意代码会被直接执行。 - 如果内容包含用户输入,一定要先过滤掉危险标签(比如
<script>、<iframe>),再用这个语法输出。
内容的提问来源于stack exchange,提问作者fros
相关产品推荐
相关产品推荐

