网络寻租

Programmer, Gamer, Hacker

如何写邮件样式

| Comments

最近一段时间都在写邮件的样式,以及测试邮件在各种邮箱中的展示效果,搞得焦头烂额,痛定思痛,在这里整理获得的一些撞墙经验吧。

基本的原则

用table来控制架构

虽然现在css已经进化到可以用来画画的地步, 但是各种邮箱客户端往往各自为政,你调试得非常完美的邮件,在用户那边,被客户端蹂躏得惨不忍睹。 我们还是需要退而求其次,找一个各种客户端都支持得非常好的布局方案:利用table来布局。

用table的方式安排页面各个元素的方法,有着悠久的历史,虽然不优雅,但是能够解决问题。 删除掉各种在web端应用广泛的floatposition吧,勇敢回归table

inline css样式

邮件中带有css外链?邮件中含有<style>区块?很抱歉,在Gmail以及各种在线邮箱客户端中, 它们都会被当做嫌疑分子,有杀错没漏过地一律干掉。唯一可以通行的就只有嵌入在tag中的style属性了。 不过不要紧,你不需要手写这些,现在有很多第三方的工具来帮助你自动生成,比如premailer

注意可用的css样式

虽然style可以通行,但是广大客户端为了显示正常,还会过滤掉一些影响大局稳定的css属性, 比如Gmail就会杀掉position: absolute的样式,hotmail看float不顺眼。

还有就是客户端应用程序的邮件显示渲染系统一般进行了客制化,邮件的样式还是最好还是限制在css1/css2标准里面安全一些。

有一个各个客户端的css支持表格,聊胜于无。

text模式和html模式

按照需要, 一封邮件可以同时提供texthtml两份,用户可以选择自己喜欢的看。 如果你的用户期望看到text格式的邮件,最好提供一份。

显示图片和非显示图片

因为安全因素考虑,大多数邮件客户端都不默认显示邮件的图片,需要用户手动确认。 所以你的邮件必须要能够在这种情况下面显示得不至于太寒碜。

各种需要处理状况

上面这些都是总览,这里整理一些其他额外需要注意的状况。

gmail会根据你的文字宽度给你添加<wbr>的标签强制换行。我最后采用table布局的方式解决了这个问题。

不同平台下的不同浏览器会采用不同的字体。所以你也页面不要根据开发环境的字体预设宽度。

有些android手机(比如我的galaxy nexus)gmail客户端会限制页面的宽度,有些文字段落会压缩掉宽度,没有找到解决办法。

测试

邮件显示效果的测试,我觉得是最烦的一件事情了。维度太多。需要测试的有:

  • 不同的邮件客户端,thunderbird,outlook,foxmail,它们还有不同的版本。
  • 不同的在线邮箱在不同浏览器下面展示的效果。维度大概是在线邮箱系统数量乘以浏览器数量了。
  • 不同操作系统。主要是字体影响比较大。
  • 多平台,各种手机客户端,平板设备。现在是移动时代,很多人有在移动设备上读邮件的习惯。

全部测试一遍很不现实,只能根据用户特征把主流的一些环境测试一下。

经验

花费了那么多时间,这里整理一下主要的经验以供借鉴:

如果简单的邮件,只是改一份文件就好,如果模块复杂,还是需要根据区块拆分一下。 也可以用一些预处理的工具来让文件变得更易读。 我是用haml,sass,以及rails的render partial功能来把复杂邮件模块化的。

因为邮件需要不断地调整,最好养成完成一个部分的改动后就git commit一下,或者至少git add变动, 因为很容易在改动中造成错误。

要进行流程控制,每次修改完毕后都过一遍测试,总是会出现一个环境改动正确了,其他环境又出现展示问题的状况。

资料

Comments