整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「玩转前端」如何创建完美的HTML邮件

作一封邮件和制作web页面还是有很大不同的。当不同的浏览器都在不断向标准靠近的同时,大多数邮件客户端却止步不前,甚至有一些是在退步的。在2007年,Microsoft 将 Outlook 的渲染引擎从 IE 转换成 Word的渲染方式,而一些基于web的邮件客户端,像Gmail和Hotmail,则增加了一些怪异的模式,还有Lotus Notes的一些技巧。

根据我的经验来看,我们解决这些问题的关键是要关注下面三件事情。首先,保持简单,你的邮件设计的越复杂,你的邮件在某个受欢迎的、不支持标准的客户端上“抽风”的可能性就越大。其次,你需要将你的编码技巧退步十年,这通常意味着我们要使用嵌套的表格,将CSS写成内联的形式等。最后,你需要对你的设计进行规律性的测试。

使用表格布局

因为诸如Gmail和Outlook 2007 无法支持浮动(float)、外边距(margin)、内填充(padding),你需要使用表格来作为你的邮件的框架。虽然表格嵌套的方法被广泛支持,但是在对单元格的宽度、外边距和内填充的处理方法并不一致。为了达到最优的效果,当制作表格结构时,请记住下面的技巧。

1、为每个单元格设置宽度,而不是表格

当你把表格宽度、td 宽度、td的填充和CSS的填充写到一封邮件时,你看到的结果可能是每个邮件客户端它们看上去都不一样。最可靠的方法是我们将为表格的每个单元格(th,td)设置宽度,而不是表格(table)本身。如下:

永远别指望邮件客户端能够计算出你没有指定宽度的单元格的宽度。它绝对不会。同时也要避免使用基于百分比的宽度,像 Outlook 2007 这样的客户端从来不考虑这种宽度方式,特别是这些嵌套的表格。像素级视觉,如果你想对每个单元格做填充,可以使用表单的单元格填属性或者用CSS的内填充,但是不要这两种一起使用。

2、嵌套迷思

表格的嵌套相对于设置左右浮动和外边距(margin)或者表单单元格填充的方法更加稳固。如果你能使用这种表格嵌套的方法达到相同的效果,这将会给你在那些蹩脚的(buggier)邮件终端上面获得最好的结果。

3、使用一个容器表单来设置 body 背景色彩

很多邮件客户端会忽略掉在CSS中或者<body>标签中设置的背景色。针对这种情况,将你的整封邮件用一个宽度为100%的表单包起来,并且为其设置背景色。如下:

你可以使用同样的方案在背景图片的设置上,需要记住的是某些邮件客户端是不支持背景图片的,这样你就需要设置一个背景颜色作为备份方案。

4、在单元格中避免使用多余的空格(whitespace)

尽最大可能,避免<td>标签中出现空格。某些邮件客户端(Yahoo!或者Hotmail)可能会在某些场景下,对单元格的上面或者下面增加额外的填充,把你的设计破坏掉。

CSS 和基本的文字格式

当某些邮件设计师尽他们最大的努力去避免使用CSS时,他们又会去依赖梦魇般的<font>标签,但实际情况是很多的CSS属性是被大部分邮件客户端支持的。请查看下面的跨邮件终端的综合CSS支持列表list of CSS support,从中你也能发现一些安全的属性和一些应该被避免使用的属性。

1、将css写成内联(inline)的样式

Gmail就是这方面的罪魁祸首。CSS被从<head>和<body>中剥离,我们别无选择的会将样式写成内联的形式。一个好消息是你可以完全自动化的完成转化。像Premailer提供意见点击的方式完成这一过程。我强烈建议你将此步骤作为你构建活动的最后一步,你就能感受到这个CSS的所有益处。

2、避免使用字体的简写和十六进制计数法

一部分邮箱客户端会放弃对简写的css字体属性的解析。比如,绝对不要将你的字体样式设置成下面的样子。如下:

相反,我们应该写成下面的形式:

谈到字体这个话题,我最近也在不同的邮件客户端测试引用字体(@font-face)。结果是凄凉的,这些浏览器安全的字体在邮件中使用还是遥遥无期。

当我们用CSS来声明颜色属性时,有些邮件客户端并不支持简写的16进制的颜色值,比如 color:#f60; 我们需要将其补充完整 color:#ff6600;。为了达到最优的效果,我们需要使用常规写法。

段落

像前面提到的单元格的间距,段落的间距也无法做到所有客户端的一致。我看到过设计师使用两个<br>或者用DIV写上内联(inline)的外边距(margin)样式弥补这个短板,但是我最近的测试显示大多数情况下对段落的支持都还是比充足的(有一段时间 Yahoo! 根本不支持段落标签)。

最好的实践方法是对每个段落通过内联(inline)的方法设置外边距(margin),像下面这样:

再次提示,在你构建邮件的时候通过在head标签中增加样式,然后通过Premailer将他们转化成每个段落的内联样式。

如果你的设计对高度是很敏感的或者需要像素级别的完美,我强烈建议你不要将所有的段落写到一起,而是将文本的格式化工作放到表单的单元格中来做。你可能会需要使用到表单的嵌套或者单元格填充(cellpadding)/CSS 来达到期望的样子。下面就是一个例子:

链接

某些邮件客户端将会用他们的默认样式覆盖你的链接色,你可以通过两部来防止其发生。第一,针对每一个链接设置一个内联的(inline)的颜色:

接下来,增加一个冗余的 span 标签在 a 标签中。

也许这些方案看上去比较过激,如果这个颜色对你的设计很重要,这个多余的 span 标签是你达到一致表现的最好解决方案。

HTML邮件中的图片

很重要的一件需要牢记在心中的关于图片的事情是你的订阅者可能看不到你的图片。如果你有这方面的准备,你就会保持你的内容简单,并且重要的内容不通过图片的形式来展示。

在这个思想的指导下,在使用HTML邮件的过程中,下面有一些基本的要领需要牢记:

1、避免占位图片

虽然使用占位图片和嵌套表格的方式在10年前很流行,许多邮件客户端已经将其排除作为一种可靠的技术。很多客户端会使用一个相同尺寸的空占位来替换图片,另外一些会将所有的图片移除。大多数邮件客户端会给图片赋予默认的图片区块,这将导致订阅者的第一感觉很差。坚持将单元格赋予固定的宽度,让其在没有图片的时候版式不会乱掉。

2、将图片定义尺寸

如果你没有给每个图片设置尺寸,当图片没有被下载时,有些客户端会自己发明一个他们自己的尺寸,你的版式就乱掉了。同时,确保你的所有图片在被用到邮件中前,都被赋予了正确的尺寸。某些客户端会忽略你代码中设置的尺寸,而去使用真实的图片尺寸。

3、避免使用 PNG 图片

Lotus Notes 6 和 7 并不支持 8位(8-bit)和24位(24-bit)的 PNG 图片,所以需要使用GIF或者JPG格式的图片,即使这会增加而外的图片大小。

4、为背景图片提供备份的颜色

Outlook 2007 不支持背景图片(aside from this hack to get full page background images working)。如果你想在你的设计中使用背景图像,提供一个背景色作为备份支持方案。这样就能同时解决图片被屏蔽和Outlook 2007的问题。

5、不要忘记标注替代文本(alt text)

缺少标准的支持意味着邮件客户端对语义化和访问性良好的HTML邮件的破坏性是很大的。即使这样,从图片可能被屏蔽角度看,提供替代文本也是很重要的。这样即使图片在默认状态下被限制,大多数邮件客户端也能显示提供的文本来替代。另外还需要技术的是某些客户端,比如 Outlook 2007, Hotmail 和 Apple Mail 在图片被屏蔽的时候,并不提供替代文本(alt text).

6、针对 Hotmail 使用显示hack

令人费解的是,Windows Live Hotmail 对每个图片增加了几个像素的填充。一个变通的方案就是使用下面的显示属性来解决这个问题。

这样就能移除掉Hotmail的填充值,但是你也可能会给其它客户端埋下隐患。

7、避免使用浮动属性(float)

Outlook 2007 和早期版本的 Notes 并不支持浮动属性(float)。在邮件中我们可以使用对齐属性在针对图像标签做到浮动图片的目的。

如果你在 Yahoo!的邮件中发现图片的怪异表现,增加 align="top" 可能能够解决你遇到的问题。

视频邮件

由于缺少 Javascript 或者其他对象标签(object tag)的支持,视频邮件最大的程度就是gif动画(如果你认为那是视频的话)。尽管如此,我最近做的一些关于用html5 videio 标签的测试结果,还是让人感觉不错。

HTML 5的标签目前在一部分邮件终端是无法运行的,包括 Apple Mail,Entourage 2008, MobileMe 和 iPhone.作为如果视频不被支持的补救方法,你可以提供稳定的备选内容,比如gif 动画或者一个可以点击到浏览器播放视频的图片。

当然,你是否需要将视频添加到你的邮件里面,那就是另外一个议题了,如果你的答案是肯定的,你可以使用这些代码案例。

关于移动端邮件的那些事

移动端有机胺的情况近期显得比较杂乱了,随着iPhone,Android的发明和Palm和RIM的改进,认为移动端电子邮件终端不重要的年代一去不复返了。

为了给移动端订阅用户良好的体现,我们在编码的过程中也有几个关键点需要牢记心中。

1、保持宽度小于600像素

受限于邮件客户端的视窗,这条规则来移动视窗到来之前的年代就很重要。事实上,iphone 的视窗是320像素,Droid是480像素,Blackberry大概360像素。坚持最大600像素宽的设计,能够让你的邮件缩小到上面提到的设备上面依然可读。这个尺寸在桌面端和web端的预览效果也很好。

2、注意文本尺寸的自动调整

作为一个好的特性,基于webkit邮件客户端(比如 iPhone, Pre 和 Android) 能够自动调整文本的大小来提高阅读性。如果你的测试结果表明这项特点给你带来的好处是破外了你的设计,你可以通过下面的属性禁用:

不要忘记去测试

虽然近几年邮件客户端对标准的支持并没有取得长足的进步,但是某些邮件客户端的改变却从未停止(有好有坏),基于 web 的客户端,如 Yahoo!、hotmail 和 Gmail 在这方面乏善可陈。我看到过无数次可行的设计方案被停止支持,没有任何解释。

基于这个原因,你也要对你的邮件设计保持规律的测试。我发现每个月进行一些快速的测试的小技巧,特别基于web的客户端。好的消息是经过几次设计和测试,你将会从这些杂乱无章中找到规律。一些潜在的陷阱将变的可以预计,一个对邮箱友好的设计模型也会在你心中成型。


本文参考“新浪UED”:创建坚如磐石的HTML邮件

的朋友T圣诞前几天找到我,问是否能帮忙制作一个圣诞贺卡邮件发送给客户。

我赶紧在脑海中遍历一遍如何制作贺卡邮件,发现没有答案,于是赶脚去谷歌了一下,竟然意外发现了个大宝藏。

传统的邮件

与国外客户打交道,避免不了邮件的往来,尤其是节假日,可能要发一点祝贺等邮件,祝贺一下圣诞快乐或者新年快乐的,普通的邮件可能就是一段文字的祝福,或者直接在邮件客户端插入一张图片。

不过你有没有想过把邮件做的更好看一点呢?像下图这样:

如果你也想做成这样的邮件,那么这篇文章你就不要错过了,接下来就跟着我一步一步如何制作一个这样的邮件吧!

如何制作漂亮的邮件

漂亮的邮件不仅在排版布局上吸引用户的点击,而且还能体现你的与众不同,增加你的品牌记忆。

我订阅了很多国外的博客邮件,其中印象最深刻的就是Shopify的邮件

这是shopify日常的博文邮件,几乎每天都在推送,相对于其他普通的邮件的话,我更愿意看这种邮件中的文章。

这种邮件呢有个专业术语,叫HTML邮件,那什么是HTML呢?

HTML是Hyper Text Markup Language的简写,翻译成中文就是超文本语言,通俗来说就是能让图片、文字和视频排版好看的语言,通常它长这个样子:

第一次看有可能密集恐惧症会发作!

难道做一个漂亮的邮件必须要接触这些天书似的HTML吗?

当然不用,这里我找到了完全避免手工制作HTML邮件的方法,那就是可视化编辑制作HTML邮件。

可视化编辑看到字面意思我们就知道,只需拖拽编辑。

我们只用拖拽对应的元素到编辑器中即可实现想要的效果,比如要插入图片,拖一张图片元素进来,要添加一个按钮,拖一个按钮元素进来。

可视化编辑是未来制作网页和邮件的大趋势,这种方法只要你会移动鼠标就能制作内容的方法,当然能极大的提高你的办公效率。

那么有什么工具能够可视化编辑HTML邮件呢?不着急,打起精神来,接下来我将带领你一步一步的实操。

如何寻找好用的在线工具

当我想找新的使用工具的时候,会使用英文去谷歌搜索,因为国外的邮件使用场景毕竟会更多一点,选择的余地也会更多一点。

不过在搜索的时候我遇到了一个难敌,可视化编辑的英文是什么?

没关系,我们使用最简单描述法,我们要找的是邮件编辑器,邮件编辑器英文我会,就是email builder,ok,那就在谷歌里面输入入best email builder的时候,不着急回车,我们查看下拉框看看有没有什么惊喜,果然找到了一个核心关键词best drag and drop email builder-最好的拖拽邮件编辑器,这个词和可视化邮件编辑器的意思基本一致了,搜之。

通过这个搜索方法我们能快速定位自己想要找的工具,先输入简单的描述单词,然后在下拉框中寻找更详细的描述,因为谷歌会在下拉框中推送全球人民最关心的问题!

通过上面的方法我们找到了一大堆的邮件编辑工具,以下是我搜集到的网址,当然你也可以试试,也许能找到更多惊喜:

•beefree.io/bee-free•stripo.email/templates•freeemaileditor.com•mosaico.io•chamaileon.io•litmus.com/email-builder

经过多轮筛选测试,我选择了beefree.io来制作HTML邮件。

最好用的在线HTML邮件编辑器

beefree.io/templates/ 的官网告诉我,它们目前有200+个邮件模板,当我看到这些模板时,口水都流了一地,而当我知道大部分都不用注册免费使用的时候,赶紧点开一个邮件查看起来:

制作邮件贺卡的主题是圣诞节,所以我选择了一个相关的主题,点开看之:

##编辑邮件 这款圣诞主题的邮件里面有个bling bling的彩灯,看起来节日气氛就不错,就选它了,初步分析素材,我需要准备5张图片,包括:

•logo一张•主产品一张•其他产品三张

上图的第3部分我暂时不需要,就删除了,那么剩下的主要就是图片与文案的准备了,先来看看图片如何设置。

首先我来替换一下主产品图,由于主产品图片要一张PNG,PNG格式的图片背景必须是透明色,所以我要扣一下图。

这时我选择在线抠图工具remove.bg,只需上传一张图片即可完成抠图,建议纯色底抠图更干净。

嗯,抠的完美!

回到beefree,在左边点击选中主图,然后右侧出现的Change image点击一下:

然后点击一个文件夹进入,接着点击Upload,即可上传刚才抠好的图片,最后点击图片insert即可。

点击植入之后可以在右侧调整图片大小,位置,都是很方便的,drag&drop 很NICE!

特别注意,图片下面的alertnate text一定要填写,这个部分当图片无法加载出来时,alertnate text会告诉用户该图片讲的是什么

这一栏属于自我介绍或者公司介绍部分,暂时不需要直接删除

然后依次把剩下的几张产品图片上传,修改标题添加按钮链接等操作

然后把其他的社交链接都加上

这里要特别注意,由于我们使用的是免费操作,我们只能下载zip压缩包到本地

如果你已经购买付费版,那么无需接下来的操作,付费版可以直接转化为html或者导入mailchimp edm系统中直接发送邮件。

beefree的价格是月15美金,价格适中,长期制作的话建议购买付费版。

免费版的额外操作

由于没有使用付费套餐,我们只能下载一个压缩包,在解压之后可以看到两个文件:

我们点击这个.html结尾的文件,即可在浏览器中看到我们的邮件主体了:

但是这个邮件只能在自己的电脑上看到,该如何将弄到邮件里面去呢?

接着操作!以下手法比较hacker,请仔细操作。

压缩文件夹中的图片

想要把文件弄到在线的邮件里面,首先我们要做的就是把图片上传到在线。想了半天,图片应该放到在线哪里呢?我总结了一下,你可以把图片上传到:

•网站后台媒体库•mailchimp媒体库•其他图床

那么我就示范一下图片上传到自己的网站后台吧,不过在上传图片之前我建议大家将图片进行无损压缩一下。

电脑本地的图片都在image文件夹中

这里的图片格式有gif/jpg/png,jpg和png我们可以使用tinypng.com进行无损压缩

gif图片比较特殊,是一种动态图片,我们也可以使用另外一个在线工具压缩:https://www.iloveimg.com/zh-cn/compress-image/compress-gif 不过gif压缩可能会导致较小的gif变成png,请额外注意一下。

压缩图片是为了邮件加载速度更快一点

然后我们整理一下压缩过后的图片,千万注意,图片名称不要更改。

将图片上传至我们的网站后台,这里以wordpress网站演示:

然后打开图片,复制一下图片的链接:

图片链接格式一般是:

https://keentalking.com/wp-content/uploads/2020/01/Excavator1.jpg

我们删除后面的图片名称,只保留前面的部分,后面要用到:

https://keentalking.com/wp-content/uploads/2020/01/

使用subline text批量替换图片链接

这里用到的最好一个工具是subline text,官网是sublimetext.com/3,这是一款代码编辑工具,我们利用它来批量替换HTML文件中的图片链接。

首先下载subline text,官网下载的有个人免费版,安装好之后打开html文件:

然后用快捷键ctrl+f或者command+f

1.打开查找2.下方搜索框内输入"images/"3.点击find All

这时候你会发现所有包含"images/"的选项全部选中了:

接着按一下键盘上的左方向键,选中的文字变成了光标,然后按几下键盘的右方向键,移动光标到"images/"后面,点击Delete键,向前全部删除"images/" 。说起来比较复杂,但做起来很简单,请看动图操作演示

最后一步,粘贴我们之前的链接

https://keentalking.com/wp-content/uploads/2020/01/

我们发现所有的图片链接都换成了自己的官网图片链接

点击快捷键ctrl+s或command+s保存。

验证图片是否替换成功

我们验证一下这些图片是否都替换成功了。

这里我推荐使用qq邮箱来检测一下。

打开qq邮箱,写信创建一个空白邮件,然后点击“格式”,出现的工具栏中点击""

全选subline text中的所有代码:

并粘贴到qq邮箱空白邮件处,粘贴完毕点击返回可视化编辑:

出现完整的HTML即表示成功!

接下来发送给自己的工作邮箱,然后转发给用户等等都是轻车熟路啦!或者你可以直接把代码放入mailchimp等EDM发信系统也是可以的。

(来源:理清外贸

以上内容属作者个人观点,不代表雨果网立场!本文经原作者独家授权供稿,转载需经雨果网授权同意。

上雨果网搜索“跨境资料库”,领取欧美/东南亚各国市场商机、各大平台热销品报告、跨境电商营销白皮书!

在JavaScript中发布/订阅模式非常常见,并且在工作方式上与观察者模式非常相似,除了在观察者模式中,观察者是直接由其主题通知的,而在发布者/订阅者中,订阅者是通过渠道通知的 位于发布者和订阅者之间的来回传递消息。

当我们实现它时,我们将需要一个发布者,一个订阅者,以及一个存储从订阅者那里注册的回调函数的对象。

发布者/订阅者

下面我们将在代码中实现发布者/订阅者。

存储器

首先我们定义一个变量用于存储回调函数:

const subscribers = {}

订阅者

接下来,我们将定义subscribe用于将回调添加到的方法subscribers:

function subscribe(eventName, callback) {
  if (!Array.isArray(subscribers[eventName])) {
    subscribers[eventName] = []
  }
  subscribers[eventName].push(callback)
}

这里发生的是,在尝试为事件名称注册回调侦听器之前,它会检查存储中的eventName属性subscribers是否已经是array。如果不是,则假定这将是第一个注册的回调,subscribers[eventName]并将其初始化为数组。然后,将回调函数添加到数组中。

发布者

当publish事件触发时,它会带两个参数:

  • 事件名称eventName
  • 事件data,将作为subscribers[eventName]每个回调函数的参数。可以是一个或多个参数
function publish(eventName, ...args) {
  if (!Array.isArray(subscribers[eventName])) {
    return false
  }

  subscribers[eventName].forEach(callback => {
    callback.apply(this, args)
  })
}

在发布事件时,会先检查事件是否被注册过,如果没有,则返回。然后我们通过遍历subscribers[eventName]中的回调函数,并将data(这里的data为args数组)作为回调参数来执行这它。

注册订阅者

根据上述代码描述,我们有了以下订阅者:

subscribe('data', (...args) => {
  console.log(...args)
})

并且在将来的某个时间里通过publish调用该方法:

publish('data', {
  type: 'update',
  data: {
    value: 1000
  }
})

取消订阅

这就是发布者/订阅者模式的工作方式!我们实现了subscribe和publish函数以及一个储存回调函数的全局变量`subscribers。subscribe用于注册事件以及回调函数,publish用于触发所有已注册回调的方法。

不过还有一个问题。在真实的应用程序中,如果我们订阅许多回调,我们可能会遭受永无止境的内存泄漏。因此,我们最后需要的是一种在不再需要订阅的回调时将其删除的方法。

通常有两种方案来取消订阅:

  1. 实现unsubscribe方法, 在需要取消订阅时调用该方法
  2. 在subscribe方法中返回取消订阅函数

这里我们采用方案2来实现取消订阅,更改订阅部分代码为:

function subscribe(eventName, callback) {
  if (!Array.isArray(subscribers[eventName])) {
    subscribers[eventName] = []
  }
  const index = subscribers[eventName].length

  subscribers[eventName].push(callback)

  return () => {
    subscribers[eventName].splice(index, 1)
  }
}

在该示例中,我们在添加subscriber之前获取subscribers的长度,然后通过splice方法来删除我们要查找的项目索引。

这样,当我们需要取消调用时,只需要执行订阅时的返回函数即可.

const unsubscribe = subscribe('data', (...args) => {
  console.log('Received data:', ...args)
})

// 取消订阅
unsubscribe()

在Vue中实现发布/订阅

在Vue中,我们可以通过event Hub更方便更简单的实现发布订阅模式。

import Vue from 'vue'

const eventHub = new Vue()

const topic = {
  publish(eventName, ...args) {
    eventHub.$emit(eventName, ...args)
  },
  subscribe(eventName, listener) {
    eventHub.$on(eventName, listener)
  },
  off(eventName) {
    eventHub.$off(eventName)
  }
}

export default topic

本文中的所有代码都已经上传到github。 地址: JavaScript中的发布/订阅模式


及时获取更新,了解更多动态,请关注 https://www.gogoing.site

如果你觉得这篇文章对你有帮助,欢迎关注微信公众号-前端学堂,更多精彩文章等着你!