邮件模板实践小结
背景
有这么一种业务情景,比如说一个电商网站,用户下单了,然后就往用户的邮件里面发一封邮件告知用户。
此过程一般经历如下
用户下单
后端读取前端的邮件模板(HTML)
后端填充数据
后端把邮件发送到用户邮件服务器
用户打开邮件,浏览器呈现邮件内容
处理时候注意要点
这里面,用户的邮件服务器接收到邮件之后,会进行各种各样奇怪的处理
- 简单的,会把js去掉,因为这些不太安全
- 有一些会把样式标签去掉,例如
<link rel="stylesheet">
,<style>
- hotmail会非常变态地,把你的网页改得面目全非,一些HTML标签和类名都会改
针对以上情况,我们在做邮件模板的时候,要注意以下要点:
- 样式内联,即
<div style="color:red;">我是红色字</div>
- 不能用伪元素,内联是不支持的
- 不要用css hack
<div style="*zoom:1;color:red;">我是红色字</div>
会导致红色的样式无效 - 浮动最好不要用
- 推荐table 布局
实践 -- juice
实践过程中,要把样式都写在style中是一件很蛋疼的事情,这可以用工程化去处理,juice 是一个解决方案。
juice 会分析邮件中html与css语法,根据语法规则去内联css。而邮件发送的过程是需要嵌套后台模板的,所以此处就需要在嵌套的时候不要破坏html的语法,比如
<div class="a <!-- IF b --> b<!-- ENDIF -->">
就要写成
<!-- IF b --><div class="a b"><!-- ELSE --><div class="a"><!-- ENDIF -->
或者是利用node作为中间层去处理。
实践 -- nodemailer
如何调试邮件的模板?首先我们内联之后,嵌套了数据的页面要能在本地访问到,然后可利用 nodemailer 去发送给到要测试的服务器上
request(url).then(resp =>sendEmailUseNodemailer({
subject: item.subject,
html: resp.body
}));
体会 -- hotmail
hotmail会把你的邮件改得面目全非,自己体会
原html
<div class="mail">
<p style="height:100px;background:red;"></p>
<div class="mail2" style="position:relative;margin-top:1px; background-image:url(https://avatars1.githubusercontent.com/u/4214942);">
<div class="mail3" style="margin:-3px;">234234234234</div>
</div>
<section>asdfasdf</section>
</div>
发送之后
<div class="x_mail">
<p style="height:100px; background:red"></p>
<div class="x_mail2" style="margin-top:1px">
<div class="x_mail3" style="">234234234234</div>
</div>
asdfasdf </div>
体会 -- qqmail
在qq邮箱的css代码中,有这么一行代码
.btn,button,.qm_btn{
color:#000!important;
}
那么你的邮件正文中 <div class="btn" style="color:red;">我想要红色字</div>
结果将会是 黑色字
总结
我们对于邮件模板的处理方案如下
- 样式内联
- 不用伪元素
- 不用css hack
- 不用浮动
- 多用table布局
- 不要用html5语义化标签如section,header,article,hgroup,asides
- 不要用 position:relative;margin-top; background-image;
- 不要用一些属性值为负值 例如 left:-1px,没有细测所有情况
- 不要带有类名
- 最后最后,提供一个让用户可以在线访问你的邮件正文的连接
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论