背景
工作中需要编辑一份邮件,通过后端自动发送到指定成员。其中邮件的内容需要有图片、文字及表格,并通过HTML结构进行书写。了解到邮件HTML与平时写的HTML不完全相同,邮件中很多HTML的用法不能被识别,因此对其常用且基本的使用方法进行梳理。
基本规则
- 使用 table 布局
邮件HTML几乎只支持以下元素:table / tr / td / img / a
;
由于各个邮箱对 div 布局的解析问题较大,因此老式的 table 布局较为稳妥;
table的td元素有1px的白边,需要使用border-collapse: collapse
进行移除。 - 样式通过行内式进行书写
邮件HTML不支持外部的style文件;由于部分邮箱会移除style标签,故也不要试图使用style标签书写样式;
建议始终使用内联style属性进行样式书写。 - 尽量使用属性而非样式
邮箱不支持以下样式:float / position / display / background-image / margin / padding / trans... / text-indent
;
使用常见属性如下:width / height / bgcolor / align / valign
。 - 样式单独指定
大部分邮箱无法完整继承父元素样式,且邮箱的默认样式会对整体效果造成一定影响,故每个元素的样式需要单独指定,即使它十分繁琐。
例如:
<!-- 不能写成: -->
<p style="margin: 1px 0;">
<!-- 需要写成 -->
<p style="margin-top: 1px; margin-right: 0; margin-bottom: 1px; margin-left: 0;">
- 背景图片
background-image会被过滤,故无法通过css设置背景图。 - 文字
font-family仅支持系统字体;
不支持font简写,color也尽量不使用简写;
加粗尽量使用b标签而非font-weight;
文字不自动换行。 - 行高
修改默认行高,添加mso-line-height-rule: exactly;
- body 之外的内容几乎没用
包括 DOCTYPE、html、head、body 标签 - 图片
图片是唯一可以引用的外部资源,其他的外部资源,例如样式文件、字体文件、视频文件等均不能引用。
部分客户端默认不显示图片,因此建议确保没有图片主要内容也可以被阅读。
太高的图片会被剪切,图片不能超过1728px。
不支持带动画的gif。
图片设置border=0,并尽量同时设置宽和高,以防止在不同分辨率下图片变形的问题。
其他注意点
- 放弃JavaScript
邮箱本身存在严重的信息欺骗、机密泄漏、病毒入侵等风险,因此不要抱着邮箱允许注入脚本的希望。 - 模板
可以在网上查找邮件的html模板,简化开发。 - 样式相关
a. 居中使用:align=center
。
b. 尽量减少百分比和auto的使用。
OUTLOOK查看邮件HTML方法
操作 -> 其他动作 -> 查看原文件
邮件HTML调试方法
方法一:使用OUTLOOK
OUTLOOK版本:2016
- 文件 - 选项 - 自定义功能区:勾选开发工具
- 开发工具 - 宏安全性 - 为所有宏提供通知
- 开发工具 - Visual Basic - 工具:勾选
Microsoft Word 16.0 Object Library
- 开发工具 - 宏:自定义名称创建,并在弹窗的 Sub HtmlTest() 和 End Sub 之间插入如下代码(其中
E:\Outlook\test.html
为需要读取的HTML的绝对路径)
Dim insp As Inspector
Set insp = ActiveInspector
If insp.IsWordMail Then
Dim wordDoc As Word.document
Set wordDoc = insp.WordEditor
wordDoc.Application.Selection.InsertFile "E:\Outlook\test.html", , False, False, False
End If
- 新建邮件 - 开发工具 - 宏:选择新建的宏即可
详细操作可参考【参考资料2】
方法二:使用QQ邮箱
在书写邮件的文本框上部依次点击:格式
-> </>
;再将html代码赋值到文本框即可。
其他问题
- 问题描述:
在设置背景色的区域中,使用 table > tr > td 的格式写了一些文本,但是在邮件中打开后有时会在文字下出现白线,且随分辨率变化,白线时隐时现。 - 问题解决
给外层的 table 标签添加如下两条样式
<table style="border-collapse: collapse; padding: 0;">...</table>