Google HTML Service评估邮件模板时MSO条件注释被误删的问题咨询
问题核心成因
Google HtmlService 自带强制HTML安全清洗机制,这是设计层面的固定规则:只要调用.evaluate()生成输出内容,系统就会主动识别、剥离所有微软Office专属的条件注释、带命名空间的VML自定义标签(比如你用到的v:roundrect),这类内容会被判定为存在安全风险的无效代码直接删除,没有任何官方配置项可以关闭这个清洗逻辑,靠调整模板写法绕开是不可能的。
可落地的解决思路
- 彻底切断HtmlService的解析链路
直接放弃用HtmlService.createTemplateFromFile().evaluate()生成邮件HTML的流程,把包含mso条件注释、VML标签的完整邮件模板作为纯字符串存到Apps Script的脚本文件里,最后直接把这个字符串传给MailApp.sendEmail的htmlBody参数。因为全程没有经过HTML解析器的清洗环节,你模板里用到的<!--[if mso]><v:roundrect ...v:roundrect><![end if]-->、<!--[if !mso]><td align='center'...></td><![endif]-->这类兼容代码,会原封不动保留在最终发送的邮件源码里。 - 自己实现极简模板渲染替代HtmlService的模板能力
如果模板里需要填充动态内容(比如用户姓名、活动链接),完全不需要依赖HtmlService的模板引擎,自己写几行代码做占位符替换就能满足需求:- 把带条件注释的静态模板内容作为纯字符串存储,需要动态填充的位置加自定义占位符(比如
{{nickName}}、{{活动链接}}) - 脚本运行时读取原始模板字符串,用
String.replace()方法把占位符替换成实际的业务数据 - 替换完成的字符串直接传给MailApp作为邮件HTML入参,全程没有任何HTML解析步骤,不会出现代码被清洗删除的问题
- 把带条件注释的静态模板内容作为纯字符串存储,需要动态填充的位置加自定义占位符(比如
- 常见踩坑提醒
不要试图用HTML实体编码拆分条件注释的方式绕过HtmlService的清洗,这类操作在HtmlService输出阶段就会被解码后再次过滤,完全达不到保留代码的效果。验证适配效果时请直接用Outlook桌面客户端打开收到的邮件检查,Gmail、Apple Mail这类客户端本身会自动忽略mso条件注释,没有出现对应差异化渲染效果是正常现象,不是代码没生效。
内容的提问来源于stack exchange,提问作者sempiternal1
相关产品推荐
相关产品推荐

