HTML Email 编写指南

作者: 阮一峰

日期: 2013年6月16日

今天,我想写一个"低技术"问题。

话说我订阅了不少了新闻邮件(Newsletter),比如JavaScript Weekly。每周收到一封邮件,了解本周的大事。

有一天,我就在想,是不是我也能做一个这样的邮件?

然后,就发现这事不那么容易。抛开后台和编辑工作,单单是设计一个Email样板,就需要不少心思。

因为这种带格式的邮件,其实就是一张网页,正式名称叫做HTML Email。它能否正常显示,完全取决于邮件客户端。大多数的邮件客户端(比如Outlook和Gmail),会过滤HTML设置,让邮件面目全非。

我发现,编写HTML Email的窍门,就是使用15年前的网页制作方法。下面就是我整理的编写指南。

1. Doctype

目前,兼容性最好的Doctype是XHTML 1.0 Strict,事实上Gmail和Hotmail会删掉你的Doctype,换上这个Doctype。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

 <head>

  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

  <title>HTML Email编写指南</title>

  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>

 </head>

</html>

使用这个Doctype,也就意味着,不能使用HTML5的语法。

2. 布局

网页的布局(layout)必须使用表格(table)。首先,放置一个最外层的大表格,用来设置背景。

<body style="margin: 0; padding: 0;">

 <table border="1" cellpadding="0" cellspacing="0" width="100%">

  <tr>
   <td> Hello! </td>
  </tr>

 </table>

</body>

表格的 border 属性等于1, 是为了方便开发。正式发布的时候,再把这个属性设为0。

在内层,放置第二个表格。用来展示内容。第二个table的宽度定为600像素,防止超过客户端的显示宽度。

<table align="center" border="1" cellpadding="0" cellspacing="0" width="600" style="border-collapse: collapse;">

 <tr>
  <td> Row 1 </td>
 </tr>

 <tr>
  <td> Row 2 </td>
 </tr>

 <tr>
  <td> Row 3 </td>
 </tr>

</table>

邮件内容有几个部分,就设置几行(row)。

3. 图片

图片是唯一可以引用的外部资源。其他的外部资源,比如样式表文件、字体文件、视频文件等,一概不能引用。

有些客户端会给图片链接加上边框,要去除边框。

  img {outline:none; text-decoration:none; -ms-interpolation-mode: bicubic;}

  a img {border:none;}

  <img border="0" style="display:block;">

需要注意的是,不少客户端默认不显示图片(比如Gmail),所以要确保即使没有图片,主要内容也能被阅读。

4. 行内样式

所有的CSS规则,最好都采用行内样式。因为放置在网页头部的样式,很可能会被客户端删除。客户端对CSS规则的支持情况,请看这里

另外,不要采用CSS的简写形式,有些客户端不支持。比如,不要写成下面这样:

  style="font: 8px/14px Arial, sans-serif;"

如果想表达

  <p style="margin: 1em 0;">

要写成下面这样:

  <p style="margin-top: 1em; margin-bottom: 1em; margin-left: 0; margin-right: 0;">

5. W3C校验和测试工具

要保证最终的代码,能够通过W3C的校验,因为某些客户端会把不合格属性剥离。还要使用测试工具(1, 2, 3),查看在不同客户端的显示结果。

发送HTML Email的时候,不要忘记MIME类型不能使用

  Content-Type: text/plain;

而要使用

  Content-Type: Multipart/Alternative;

发送工具可以考虑使用 MailChimpCampaign Monitor

6. 模板

使用别人已经做好的模板,是一个不错的选择(这里这里),网上还可以搜到更多

自己开发的话,可以参考HTML Email BoilerplateEmailology

7. 参考链接

进一步研究,请参考下面的文章。

  - Sean Powell,Say Hello to the HTML Email Boilerplate
  - Nicole Merlin,Build an HTML Email Template From Scratch
  - Nicole Merlin, What You Should Know About HTML Email

(完)

留言(30条)

感觉自web2.0时代开始Email的功能已经弱化了很多,这使得各种Email相关标准和软件都停滞不前。

如果是复杂布局的话还真是需要下一番功夫

这样写能够提升此类邮件的到达率!

我正想着要不要编写一个呢,因为上周六看到一个人分享的Email好看格式。可原来outlook 等会过滤这些定制邮件呀,那就算了。

京东淘宝之流应该会经常发这些小广告吧,就是让你去点,估计就是这中吧

主流 web framework 應該都會有處理html email 的庫,如 Rails 有 Roadie (https://github.com/Mange/roadie) 自動幫你把樣式銜入 html 裡面。

好帖子,正在准备写Email html,为工会活动宣传; 可是也得需要一点美工功底

补充一下,thunderbird里插入HTML的方法:
菜单Insert->HTML...

我是先看了你的一些日志然后看到你一个朋友的日志,听他的日志里介绍到你,然后又回来看你的日志,仔细拜读了,好佩服你哦,尤其是翻译的一些文章。你的文章里有很多你自己的想法,只是我不明白,为什么我看到别人的想法,我很赞同,但是很多时候又说不出自己的想法,看书好像也没用。
我看你朋友的日志里写你准备按照DANPLAN 里的来专职it。不知道你执行了没有,不过你的起点比dan 高,至少你有10多年的计算机基础了。

邮件中阉割大部分HTML的功能可以有效防止蠕虫等在互联网上传播,写HTML的email很多样式被砍一方面是邮件客户端不能很好的解析这些样式(一些浏览器都难以做到兼容,再加上邮件客户端也来参合,估计web前端搞兼容的可以去死了),另一方面从互联网安全的角度来考虑,HTML写email是不能使用js等脚本语言的。电子邮件是最早使用的互联网服务,保持简单传统我觉得很好,KISS原则。

发个邮件也需要考虑这么多吗? 事情往细处做了,就什么都不简单了呀。

之前刚折腾过邮件模板,感谢分享,尤其那些参考的文章很有用

感谢分享!对用程序发送邮件以及邮件营销很有指导意义。

嗯,写得非常好,的确如此,之前我也遇到过邮件客户端兼容性的问题。再次受教了。

我干过这事,一般邮件都是设计的比较中规中矩,不能太花哨,不支持背景

简单的东西都能说出如此大道理,很是用心那。

"网页的布局(layout)必须使用表格(table)"


用table来布局不是很不被推荐的方法么?因为当email的内容持续增长,会出现很多的多层nested table, 这不仅降低了页面加载时间,还让后续开发设计变得更困难。

现在流行的html email没有其他更好的layout解决技术吗?

我不大理解,为什么是使用table来进行布局呢?

邮件中是否支持视频在线预览呢?
js不被支持吗?
有没有办法让很多邮箱系统不过滤掉发出的邮件呢?像QQ等很多邮件系统是直接过滤扔到垃圾箱里的,有些有提醒,有些没提醒。
谢谢

昨个儿刚写过邮件模板。。在gmail和hotmail里面打开测试邮件的时候,整个人都感觉不好了。。。

赞一个,用的freemarker模板给邮箱发邮件,发现FoxMail里面能显示样式,网页版的邮箱里面却怎么也显示不出来,原来是写在head里面了,不过都用行内样式模板文件可读性降低了 ^O^

我想问下您,在行内样式里使用:position:absolute;left:0;top:0;管用吗?就是兼容性怎么样?我测试了好像管用,就是不知道兼容性怎么样,我是mac上自带的邮件.

我擦,终于找到了这个!特别是谷歌邮箱,各种限制。发送到 163 qq邮箱都正常显示,谷歌邮箱就。。。

引用侯剑波的发言:

我不大理解,为什么是使用table来进行布局呢?

使用div布局会走样,用谷歌邮箱测试效果更佳

引用鱼叶瑞的发言:

昨个儿刚写过邮件模板。。在gmail和hotmail里面打开测试邮件的时候,整个人都感觉不好了。。。

自己写这样的图文邮件,确实不太容易,需要掌握太多的知识和经验。

所以,我认为使用现成的网上的模板是一个比较好的方法,至于网址,您可以自己百度搜索肯为旎邮件DIY,也可搜索关键词:图文并茂+邮件。

使用现成的模板的好处是不用考虑框架和兼容性问题,别人都给您考虑好了,只需要考虑自己的内容和布局,这样效率会高一些。

1. Doctype

目前,兼容性最好的Doctype是XHTML 1.0 Strict,事实上Gmail和Hotmail会删掉你的Doctype,换上这个Doctype。


第一小段说用严格模式的声明,而示例代码中的声明确实过渡模式

确实搞邮件模板,一开始感觉还可以,一到兼容性,感觉瞬间的完蛋了......

可以用hover这些伪元素吗?

最近第一次做 EDM,全部HTML都是手写的,因为各种限制以及兼容性的问题前前后后写了6个小时...真的让人抓狂。于是自己造了个 React 的组件,模仿 CSS 的网格布局来做 EDM 的布局,还用单元格来模拟 margin 和 padding,感觉舒服多了!
我把组件放到 Github 了,欢迎大家来试试!

图片别用svg!
图片别用svg!!
图片别用svg!!!

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接