前言

虽然现在的 Email Client 有在进步, 但是比起 browser 还是差太远了. 假如你用 HTML5 + CSS3 的方式去写 Email Template 的话是不行的.

这篇特地学习一下如何写好 Email Marketing HTML Template.

参考

Youtube – The RIGHT WAY to Build HTML Email Templates 2022

Youtube – HTML Email Template Built the RIGHT WAY - 2022! (主要参考)

CSS support in email client

Can I Email

HTML and CSS in Emails: What Works in 2022?

Email Client Testing Explained (一些 checker 确保写的没有错)

Mailtrap HTML Email Checker (我在用的 checker)

概念

Email Client 有超级无敌多的 CSS 是不支持的, 而且即便它支持, 也可能需要 follow 一些特定条件.

所以一个好的思路是, 只要你不知道它能不能用, 那就是不能用. 只用那些教程里面教的方法去做就好了.

给几个例子, 感受一下它有多糟糕:

1. 不要用 div, 全部用 table.

2. 不要用 marigin, 用 padding, 而且只用在特定 element 上用, 比如 td, span 之类的.

3. 只用原始的 font family 比如 serif, san-serif

4. 可以用 attribute 实现就不要用 style, 比如 table width="100%"

5. 只能用 inline style

DOCTYPE, html, meta

DOCTYPE

我们写网页的 DOCTYPE 是这样的

<!DOCTYPE html>

但在 email client, 这个是不 ok 的.

参考: Which Doctype Should I Use in HTML Email?

要用 XHTML 1.0 Transitional doctype

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

html

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

meta

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

提醒, IE=edge 和 viewport 和平常的网页是一样的

<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

Standard CSS Reset

body {
margin: 0;
}
table {
border-spacing: 0;
}
td {
padding: 0;
}
img {
border: 0;
}

注: 上面写的是 CSS Style 而不是 inline style, 那是因为我用 Gulp 打包. 最终它会变成 inline style 的. 参考: Gulp for inline style email template

大体结构

写网站一般上的结构类似下面这样

<body>
<header></header>
<main>
<section>
<div class="container grid">
<div class="left-column"></div>
<div class="right-column"></div>
</div>
</section>
</main>
<footer></footer>
</body>

container 通常会有 max-width, margin-inline: auto (for 居中), 然后 column 就用 grid 1fr, 1fr 这样搞布局.

而 Email Client 差很多...

<body>
<center> <!--main wrapper-->
<table> <!--main-->
<tr><td></td></tr> <!--section / header-->
<tr> <!--section -->
<td>
<table></table> <!-- 下面会讲 -->
</td>
</tr>
<tr><td></td></tr> <!--section -->
<tr><td></td></tr> <!--section / footer -->
</table>
</center>
</body>

1. 没有 div, 基本上全部都是 table > tr > td (经常会出现只有 1 个 tr 1 个 td 但依然得写整个 table 结构, 相当繁琐)

2. <center> 会把里面的 table 居中. 相等于 table margin-inline: auto. (Email Client 是无法写 margin 的, 要做 spacing 靠 padding)

3. wrapper 负责整个 body 的 background-color

4. main 是所以内容的 container, 通常 max-width: 600px

5. main 里面就是每一个 "section" 了, 里面再开一个 table for 内容

6. 提醒: table width 默认是 hug content 哦, 通常需要 set 成 100% 如果要 td 平均的话 table-layout: fixed

接着 section 里的 table 长这样

<table class="two-column">
<tr>
<td>
<table class="column">
<tr>
<td>
<!-- 内容 -->
<h1></h1>
<p></p>
</td>
</tr>
</table>
<table class="column">
<tr>
<td>
<!-- 内容 -->
<a href=""><img src="" alt=""></a>
<a href=""><img src="" alt=""></a>
</td>
</tr>
</table>
</td>
</tr>
</table>

看你需要多少 column, 就开多少 table

以上就是大体的结构. 概念就是 nested table 很多.

如何做 RWD & Spacing & Alignment

用 padding 做 spacing

把 table.column 变成 display: inline-block 做 RWD

text-align, verical-align 以外. 如果想居中可以靠 padding 推. (因为大部分 dimension 都是写死的, 要居中可以硬硬算出来)

看 Youtube – HTML Email Template Built the RIGHT WAY - 2022! 就能体会它怎样做 RWD, Spacing, Alignment 了.

可以用的 CSS

width : px, %

max-width

padding (apply to td), 支持 shorthand

background-color: rgba, hex

color

box-shadow

font-size

display

不可用 CSS

text-align (用 td attribute align 代替)

vertical-align (用 td attribute valigh 代替)

white-space: preline (用 <br> 代替)

可以用的 Attribute

td height, align, valign

img width

table width

CSS – 冷知识 – font-size: 0 clear anchor spacing between

Mailtrap HTML Email Checker

很好的工具. 可以检查我们写的 HTML 对不对. Free version 有使用 limit. 但基本够用

Sign in 好了之后去 Control Panel 拿 username password

下面是 MailKit SMTP Client 演示代码

var username = "abc";
var password = "xyz";
var htmlFile = @"C:\path\email-template.html";
using var client = new SmtpClient();
await client.ConnectAsync(
host: "smtp.mailtrap.io",
port: 2525,
options: MailKit.Security.SecureSocketOptions.StartTls
);
await client.AuthenticateAsync(username, password); var message = new MimeMessage();
message.From.Add(new MailboxAddress("", "from@example.com"));
message.To.Add(new MailboxAddress("", "to@example.com"));
var builder = new BodyBuilder
{
HtmlBody = await System.IO.File.ReadAllTextAsync(htmlFile, System.Text.Encoding.UTF8),
TextBody = "Test Email Only"
};
message.Subject = "Hello world";
message.Body = builder.ToMessageBody();
await client.SendAsync(message);
await client.DisconnectAsync(quit: true);

发送之后, 就可以到 inbox 查看了

它下面会逐个列出有问题的. 红色是不支持, 黄色是 partial 部分支持

总结

我还没有机会真的做一个 Marketing Email. 目前只是用来做 forgot password 这类 internal 自己用的.

所以 design 再丑也无所谓. 以后做了美美的在来完整这篇.

HTML / CSS – Email Marketing HTML Template的更多相关文章

  1. html & email template

    html & email template inline style build tools https://templates.mailchimp.com/getting-started/h ...

  2. [TypeStyle] Generate static css + html files using TypeStyle

    You can easily use TypeStyle to build static html files with encapsulated CSS. You can use this patt ...

  3. Marketing with Microsoft Dynamics CRM IDEA CONFERENCE

    Object:Marketing with Microsoft Dynamics CRM  IDEA CONFERENCE  24 SEPTEMBER 2015 | BROADCAST ONLINE ...

  4. How to Verify Email Address

    http://www.ruanyifeng.com/blog/2017/06/smtp-protocol.html  如何验证 Email 地址:SMTP 协议入门教程 https://en.wiki ...

  5. webpack4 单独抽离打包 css 的新实现

    webpack4 单独抽离打包 css 的新实现 前言 之前我们使用的打包 css 无非两种方式:① 将 css 代码打包进 入口 js 文件中:② 使用第三方插件(extract-text-webp ...

  6. 四、Vue过渡与动画、过渡css类名、自定义指定、过滤器

    一.过渡 动画 1.1简单的过渡动画使用 parent.vue [0]定义一个待显示的数据 [1]定义一个显示隐藏flag [2]使用动画过滤标签,name用来连接style样式:v-show用来控制 ...

  7. css 实现输入效果

    <template>   <h1>Pure CSS Typing animation.</h1> </template> <script> ...

  8. git全局配置

    使用git的童鞋都知道,git是非常好的版本管理工具,工具再好要想用的得心应手还是要下凡功夫的,比如可以通过对git的全局配置文件.gitconfig进行适当的配置,可以在日常项目开发中节省很多的时间 ...

  9. discuz默认模板文件结构详解-模板文件夹介绍

    | — template — default   系统内置风格模板(默认风格)| — template — default  – discuz_style_default.xml  风格安装文件,可用 ...

  10. 02: vue.js常用指令

    目录:Vue其他篇 01: vue.js安装 02: vue.js常用指令 目录: 1.1 vuejs简介 1.2 选择器:根据id.class等查找 1.3 静态绑定数据 data 1.4 插值 { ...

随机推荐

  1. UE导入FBX、GLTF模型

    楔子 虽然做了很多年的三维可视化,不过都主要还是web端开发为主(webgl,threejs,有兴趣的读者也可以关注下我的相关专栏).最近准备入手一下UE,顺便做一下知识梳理. 所以文章可能都是比较粗 ...

  2. 用ssh同时push 项目到github和gitee的方法

    ​ 分别为两个网站声称pubkey cd ./ssh ssh-keygen -t rsa -C "oeasy@oeasy.org" -f "github_id_rsa&q ...

  3. ComfyUI进阶:Comfyroll插件 (六)

    ComfyUI进阶:Comfyroll插件 (六) 前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业 ...

  4. RHCA cl210 013 制作镜像 轮转key rabbitmq追踪 写时复制 keystone多域登录图形界面

    undercloud 部署 overcloud overcloud控制节点上的组建rabbitmq 排错需要rabbitmq,开启追踪则会更详细,会消耗性能 环境问题 登录一下classroom os ...

  5. Ubuntu 20.04 双系统安装完整教程

    1.查看电脑的信息 1.1 查看BIOS模式 "win+r"快捷键进入"运行",输入"msinfo32"回车,出现以下界面,可查看BIOS模 ...

  6. [香橙派开发系列]3b系统安装和使用vscode进行远程连接

    目录 前言 一.下载镜像和安装系统 二.使用串口助手进行调试 三.查看系统的ip地址 四.使用vscode连接香橙派 最后 前言 之前研究中断的时候一直出现问题,我怀疑是因为zero 3不支持,所以一 ...

  7. 【微信小程序】 列表查询功能

    对应本地生活案例: https://www.bilibili.com/video/BV1834y1676P?p=52 HTML代码部分: 就是普通的wx-for指令遍历 <!--pages/cl ...

  8. 【VMware】 桥接网路发现无法Ping通原因

    解决方案参考: https://blog.csdn.net/weixin_33856370/article/details/92420910 设置好的同网段的三台虚拟机这次开机连不上网了 仔细发现VM ...

  9. 使用Transformer模型实现四足机器人控制—— 跨模态Transformer: LocoTransformer —— LEARNING VISION-GUIDED QUADRUPEDAL LOCOMOTION END-TO-END WITH CROSS-MODAL TRANSFORMERS

    论文: LEARNING VISION-GUIDED QUADRUPEDAL LOCOMOTION END-TO-END WITH CROSS-MODAL TRANSFORMERS 发表于ICLR20 ...

  10. URDF使用语法【万字解析赶紧码住】 —— 机器人统一描述文件格式(Unified Robot Description Format)

    原文地址: https://zhuanlan.zhihu.com/p/665269288 具体内容略,请参照原文.