最近整理了一份HTML邮件模板,目标是确保在主流邮箱客户端(Gmail、Outlook、iOS Mail、Android等)都能正常显示,并兼顾桌面和移动端的响应式布局。这里将实现过程和一些细节心得分享给大家,欢迎一起讨论和指正。
完整 HTML 模板(可拷贝直接使用)
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>Responsive Email</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 基本样式与移动端媒体查询(请尽量保持简洁,避免过长以防 Gmail 裁剪) -->
<style>
/* Reset 和 Outlook 专用空格处理 */
table, td { mso-table-lspace:0pt; mso-table-rspace:0pt; }
img { border:0; outline:none; text-decoration:none; -ms-interpolation-mode:bicubic; display:block; }
a { color:inherit; text-decoration:none; }
/* iOS 自动识别电话/日期的颜色修复 */
a[x-apple-data-detectors] { color:inherit !important; text-decoration:none !important; }
/* 基础字体(webfont 只是装饰,邮箱端常不加载) */
body { margin:0; padding:0; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; background-color:#f4f4f4; }
/* 移动端响应:列堆叠 & 流体图片 */
@media only screen and (max-width:600px) {
.stack-column { display:block !important; width:100% !important; max-width:100% !important; }
.fluid-img { width:100% !important; height:auto !important; max-width:100% !important; }
.center-mobile { text-align:center !important; }
.p-sm { padding:12px !important; }
.hide-mobile { display:none !important; }
}
</style>
</head>
<body style="margin:0; padding:0; background-color:#f4f4f4;">
<!-- 预览文本(preheader)------务必放在 body 开头,且可见性对常规邮箱隐藏 -->
<div style="display:none; max-height:0; overflow:hidden; font-size:1px; line-height:1px; color:#f4f4f4; opacity:0;">
欢迎使用我们的服务 --- 立即了解我们如何帮助您提升体验与收益。
</div>
<!-- 外层 100% 容器(用于背景色与居中) -->
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td align="center" bgcolor="#f4f4f4" style="padding:20px;">
<!-- 内芯:固定宽度 600,桌面显示;移动端通过媒体查询适配 -->
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="600" style="width:600px; max-width:600px; background-color:#ffffff; border-radius:8px;">
<!-- Header(深色条) -->
<tr>
<td align="center" bgcolor="#333333" style="padding:20px;">
<p style="margin:0; font-family:Arial, Helvetica, sans-serif; font-size:20px; line-height:24px; color:#ffffff; mso-line-height-rule:exactly;">
Welcome to Our Newsletter
</p>
</td>
</tr>
<!-- Banner(放在页面顶部,建议使用 2x 尺寸素材以支持 Retina) -->
<tr>
<td style="padding:0;">
<img src="https://unsub.startrader.asia/rs/992-TQQ-546/images/email_20250207_CopyTrading_img01.png?version=0"
alt="横幅图示" width="600" style="display:block; width:100%; max-width:600px; height:auto;"
class="fluid-img">
</td>
</tr>
<!-- 欢迎标题 -->
<tr>
<td style="padding:24px 20px 0 20px; font-family:Arial, Helvetica, sans-serif;">
<p style="margin:0; font-size:26px; line-height:30px; color:#333333; font-weight:700;">
欢迎使用我们的服务
</p>
</td>
</tr>
<!-- 介绍段落 -->
<tr>
<td style="padding:12px 20px 20px 20px; font-family:Arial, Helvetica, sans-serif;">
<p style="margin:0; font-size:16px; line-height:24px; color:#555555;">
亲爱的用户,感谢您选择我们。我们将为您提供优质体验。Resize your browser or open this on a mobile device to test it.
</p>
</td>
</tr>
<!-- Two-column 图片示例(桌面并排,移动堆叠) -->
<tr>
<td style="padding:0 20px 20px 20px;">
<table role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="stack-column" width="50%" valign="top" style="padding:10px;">
<img src="https://monetamarketing.monetamarkets.com/rs/536-PAR-184/images/email_moneta_20231024_accent_divider.png?version=0"
alt="示例图1" width="270" style="display:block; width:100%; max-width:270px; height:auto;">
</td>
<td class="stack-column" width="50%" valign="top" style="padding:10px;">
<img src="https://monetamarketing.monetamarkets.com/rs/536-PAR-184/images/email_moneta_20231024_accent_divider.png?version=0"
alt="示例图2" width="270" style="display:block; width:100%; max-width:270px; height:auto;">
</td>
</tr>
</table>
</td>
</tr>
<!-- 图标 + 文案模块(两列) -->
<tr>
<td style="padding:0 20px 20px 20px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
<tr>
<td class="stack-column" width="50%" valign="top" style="padding:10px;">
<table role="presentation" cellpadding="0" cellspacing="0">
<tr>
<td style="vertical-align:top; padding-right:10px;">
<img src="https://unsub.startrader.asia/rs/992-TQQ-546/images/email_20250207_CopyTrading_img04.png?version=1"
alt="" width="35" height="35" style="display:block; width:35px; height:35px;">
</td>
<td style="vertical-align:top; font-family:Montserrat, Arial, Helvetica, sans-serif; font-size:12px; color:#0D0F3B;">
<p style="margin:0 0 6px 0; font-weight:700;">Complete Transparency:</p>
<p style="margin:0; font-size:12px; line-height:18px; color:#0D0F3B;">Track every trade and every profit, so you're always in control.</p>
</td>
</tr>
</table>
</td>
<td class="stack-column" width="50%" valign="top" style="padding:10px;">
<table role="presentation" cellpadding="0" cellspacing="0">
<tr>
<td style="vertical-align:top; padding-right:10px;">
<img src="https://unsub.startrader.asia/rs/992-TQQ-546/images/email_20250207_CopyTrading_img03.png?version=0"
alt="" width="35" height="35" style="display:block; width:35px; height:35px;">
</td>
<td style="vertical-align:top; font-family:Montserrat, Arial, Helvetica, sans-serif; font-size:12px; color:#0D0F3B;">
<p style="margin:0 0 6px 0; font-weight:700;">Performance-Driven:</p>
<p style="margin:0; font-size:12px; line-height:18px; color:#0D0F3B;">Benefit from proven strategies that are designed to deliver measurable results.</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<!-- 三列功能模块 -->
<tr>
<td style="padding:0 20px 20px 20px;">
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
<tr>
<td class="stack-column" width="33%" align="center" style="padding:10px;">
<img src="https://monetamarketing.monetamarkets.com/rs/536-PAR-184/images/email_moneta_20231024_accent_divider.png?version=0"
alt="功能A" width="80" height="80" style="display:block; width:80px; height:80px; margin-bottom:10px;">
<p style="margin:0; font-family:Arial, Helvetica, sans-serif; font-size:14px; color:#333333;">功能A</p>
</td>
<td class="stack-column" width="33%" align="center" style="padding:10px;">
<img src="https://monetamarketing.monetamarkets.com/rs/536-PAR-184/images/email_moneta_20231024_accent_divider.png?version=0"
alt="功能B" width="80" height="80" style="display:block; width:80px; height:80px; margin-bottom:10px;">
<p style="margin:0; font-family:Arial, Helvetica, sans-serif; font-size:14px; color:#333333;">功能B</p>
</td>
<td class="stack-column" width="33%" align="center" style="padding:10px;">
<img src="https://monetamarketing.monetamarkets.com/rs/536-PAR-184/images/email_moneta_20231024_accent_divider.png?version=0"
alt="功能C" width="80" height="80" style="display:block; width:80px; height:80px; margin-bottom:10px;">
<p style="margin:0; font-family:Arial, Helvetica, sans-serif; font-size:14px; color:#333333;">功能C</p>
</td>
</tr>
</table>
</td>
</tr>
<!-- CTA(含 VML 子弹proof 按钮,兼容 Outlook 桌面) -->
<tr>
<td align="center" style="padding:20px;">
<!--[if mso]>
<v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word"
href="https://your-link.com" style="height:44px; v-text-anchor:middle; width:220px;"
arcsize="8%" strokecolor="#007BFF" fillcolor="#007BFF">
<w:anchorlock/>
<center style="color:#ffffff; font-family:Arial, Helvetica, sans-serif; font-size:16px; font-weight:bold;">
立即开始
</center>
</v:roundrect>
<![endif]-->
<!--[if !mso]><!-- -->
<a href="https://your-link.com"
style="display:inline-block; background-color:#007BFF; color:#ffffff; padding:12px 26px; font-family:Arial, Helvetica, sans-serif; font-size:16px; line-height:20px; border-radius:6px; font-weight:700;">
立即开始
</a>
<!--<![endif]-->
</td>
</tr>
<!-- Footer(唯一) -->
<tr>
<td style="padding:20px; text-align:center; font-family:Arial, Helvetica, sans-serif; font-size:12px; color:#999999;">
本邮件由系统自动发送,请勿直接回复。<br>
© 2025 Your Company. 如果您不想收到此类邮件,请 <a href="https://your-unsubscribe-link.com" style="color:#007BFF;">取消订阅</a>。
<div style="height:6px;"> </div>
<div style="font-size:11px; color:#bbbbbb;">Your Company 地址信息(示例),城市,国家</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
下面逐段详解(新手友好、逐步可操作)
我把模板拆成若干"模块",每个模块解释:它的作用、为什么要这样写、常见问题与如何测试/修复。
1) 开头与 <head>
(Reset + 媒体查询)
代码片段(已经在模板里):
html
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
table, td { mso-table-lspace:0pt; mso-table-rspace:0pt; }
img { display:block; -ms-interpolation-mode:bicubic; }
a[x-apple-data-detectors] { color:inherit !important; }
@media only screen and (max-width:600px) {
.stack-column { display:block !important; width:100% !important; }
.fluid-img { width:100% !important; height:auto !important; }
}
</style>
作用 / 为什么要这么写
-
viewport
:告知手机不要强制缩放,媒体查询才能按设备宽度生效。 -
mso-table-lspace
/rspace
:防止 Outlook 在渲染表格时产生左右空白。 -
img
的display:block
:去掉图片底部可能的空隙(默认 inline 会产生)。 -
a[x-apple-data-detectors]
:iOS Mail 会自动把电话/日期变成蓝链并改变样式,这行样式可以保留原样风格。 -
媒体查询:当屏幕 <= 600px,我们让
.stack-column
变为display:block
(移动端"堆叠"列),并让.fluid-img
变成流体图片。
常见问题 & 修复
-
Gmail App 早期版本可能不支持 head 内复杂选择器:因此把最关键的视觉样式都放在元素上(即内联样式),媒体查询放在 head 是常见做法且现代 Gmail 已支持。
-
不要把 head 的 CSS 写得太长,否则 Gmail 可能会"裁剪"(clipping)。如果模板会很大,考虑把重复样式尽量内联到常用元素。
自测
-
在桌面浏览器打开 HTML 文件,缩小窗口到 360px 看列是否堆叠。
-
在手机 Gmail、iOS Mail、Outlook(桌面/移动)分别收发测试邮件(见 QA 列表)。
2) 预览文本(preheader)
代码片段:
html
<div style="display:none; max-height:0; overflow:hidden; font-size:1px; color:#f4f4f4; opacity:0;">
这里是预览文案...
</div>
作用
- 邮件客户端的收件箱通常会显示发件人 + 主题 + 预览文本(preheader)。把一句价值点放在这里能提高打开率。
常见问题
-
如果你把预览文本写成普通可见内容,收件人到邮件正文里也会看到重复。常规做法是放隐藏的
div
在 opening,邮件客户端会读取它作为预览,但不会显示在正文位置(大多数客户端如此)。 -
Gmail 可能会从邮件正文里自动抽取预览文字,如果预览文本太短或为空,可能抓正文首句。
自测
- 发送到 Gmail,检查收件箱列表的预览文字是否是你期望的句子。
3) 外层容器(100% table)与内芯 600px 容器
代码片段(简化):
html
<table width="100%"><tr><td align="center" bgcolor="#f4f4f4">
<table width="600" style="max-width:600px; background:#fff; border-radius:8px;">
...
</table>
</td></tr></table>
作用
-
外层表格提供背景色和水平居中。
-
内芯 600px 是桌面阅读的常见宽度,兼容大多数邮箱客户端。
常见问题
-
border-radius
在旧版 Outlook(Word 渲染)不会生效:圆角可能只在 Gmail/iOS 等客户端可见。接受"降级展示"或用额外 VML 实现(复杂)。 -
overflow:hidden
对 Outlook 无效,若想裁切图片圆角应在图片本身制作圆角素材。
自测
- 在 Outlook 桌面查看,确认是否能接受圆角的降级效果(无圆角也可)。
4) Header(深色条)
代码片段:
html
<td align="center" bgcolor="#333333" style="padding:20px;">
<p style="margin:0; font-family:Arial, ...; font-size:20px; color:#fff;">
Welcome to Our Newsletter
</p>
</td>
作用
- 明确的开头条,视觉聚焦,通常放 logo 或标题。
常见问题
-
使用
<p>
的margin
在 Outlook 支持不一致。我们在示例中把margin:0
写清楚,并用父级<td>
的padding
控制间距,确保一致。 -
深色背景+文本的可访问性(对比度)要足够,确保文字可读。
5) 横幅 Banner(放在顶部)
代码片段:
html
<img src="..." alt="横幅图示" width="600" style="display:block; width:100%; max-width:600px; height:auto;" class="fluid-img">
作用
- 横幅加强视觉,通常是活动或主题关键图。
为什么同时写 width="600"
与 CSS width:100%; max-width:600px; height:auto;
- Outlook(Word 引擎)优先读属性
width
,而手机/现代客户端通过 CSS 缩放。两者同时写是"属性 + CSS 双保险"做法。
常见问题
-
如果图片很大(文件尺寸),可能被 Gmail 或其他客户端暂时隐藏或加载缓慢。尽量导出压缩的 web 图片(同时提供 2x 尺寸用于 Retina)。
-
圆角裁切:如果你想给 banner 圆角且期望 Outlook 也裁切,必须用 VML 或把圆角做在图片素材上。
自测
- 在 iPhone、Android、Gmail 网页与 Outlook 桌面打开,检查横幅是否完整显示、无横向滚动。
6) 标题 + 正文段落(行高与间距)
代码片段:
html
<p style="margin:0; font-size:26px; line-height:30px; color:#333333; font-weight:700;">...</p>
<p style="margin:0; font-size:16px; line-height:24px; color:#555555;">...</p>
作用
- 使用
margin:0
并用父<td>
的padding
控制块间距是邮件模板稳定写法(兼容 Outlook)。
常见问题
-
Outlook 对
line-height
的处理有时会不同步,添加mso-line-height-rule:exactly;
在需要精确行高的场合可解决微差异。 -
文字太长会影响用户阅读,段落不宜过长。
自测
- 检查在 Outlook 是否文字密度、行高看起来和预期一致。
7) 两列模块(桌面并排、移动堆叠)
关键写法
html
<td class="stack-column" width="50%" valign="top" style="padding:10px;">
<img ... width="270" style="width:100%; max-width:270px; height:auto;">
</td>
为什么要这样写
-
width="50%"
给桌面并排使用。 -
.stack-column
在媒体查询下改为display:block
,移动就会把两列堆叠成一列(宽 100%)。 -
图像同样采用属性 + CSS 双保险。
常见问题
-
如果你把
display:inline-block
用在移动端,某些客户端可能会在列之间表现出"空隙";display:block
更稳。 -
如果列内内容宽度超出(如固定宽图片 + 大量内边距),可能导致桌面出现水平滚动或错位 -> 确保列内元素的
max-width
与列宽匹配。
自测
- 缩小屏幕查看列是否堆叠、间距是否合适;注意按钮或可点击区域在堆叠状态下是否仍然易点按。
8) 图标 + 文案模块(小图标与两列文本)
注意点
-
小图标设置明确
width
&height
并display:block
,防止文字围绕或留白。 -
文本使用较小字号与合适行高(比如 12px/18px)以保证可读性。
常见问题
- 如果图标是透明 PNG,某些 Outlook 版本可能对透明背景处理不好(会显示为黑底);首选使用 PNG-24 或在设计时注意背景色匹配。
9) 三列模块(33%)
要点
- 三列在桌面里好看,移动端会按
.stack-column
堆叠成三段。若发现断行问题可改为固定像素列(例如 200px * 3)来保证宽度精确。
常见问题
- 小数点
33.33%
在一些旧邮件客户端四舍五入可能引起总和不正好为 100%,出现微小缝隙或换行。可改用33%
或固定像素宽度来规避。
10) CTA(按钮)------为什么用 VML 子弹proof 按钮?
代码片段(核心):
html
<!--[if mso]>
<v:roundrect ...> ... </v:roundrect>
<![endif]-->
<!--[if !mso]><!-- -->
<a href="..." style="display:inline-block; background:#007BFF; color:#fff; padding:12px 26px; border-radius:6px;">立即开始</a>
<!--<![endif]-->
解释
-
Outlook 桌面(基于 Word 引擎)对按钮的 CSS 兼容性很差:圆角、背景色、padding 可能失效。使用 VML(
<v:roundrect>
)是给 Outlook 专门写的按钮,从而保留完整样式。 -
非 Outlook 客户端显示正常的
<a>
样式。
常见问题
-
VML 语法要放在条件注释中(
<!--[if mso]> ... <![endif]-->
),否则会破坏 HTML。 -
如果不想写 VML,也可以用一个带背景颜色的
<td>
(整行链接)做备选,但视觉可能不如子弹proof 按钮一致。
自测
- 在 Outlook(Windows 桌面版)打开并确认按钮背景色、圆角、文字是否正确;在 Gmail 与 iOS 上也检查按钮是否可点。
11) Footer(合规项:退订、公司地址)
关键点
-
合规邮件必须包含"取消订阅"链接或明确的退订方式(各国家/地区法规不同,但通行做法是提供退订)。
-
显示公司信息(公司名、地址)可以提升信任并满足部分法律要求(例如:CAN-SPAM、GDPR等邮件实践建议)。
常见问题
-
退订链接若放在图片中或 JS 控制点击,可能在某些客户端无法触发;请用普通
<a href>
链接并确保链接有效。 -
退订后系统要在合理时间内停止发信(这是后端逻辑,不在模板内),但模板要保证可用链接。
12) 可访问性 & 国际化(小提示)
-
给重要图片写
alt
文本(否则图片被默认关闭时用户看不到内容)。 -
设置
<html lang="zh-CN">
有助于屏幕阅读器正确读出文本。 -
链接文案尽量具体(比"点击这里"更好):例如 "查看活动详情" 勝过 "点击这里"。
-
注意文字与背景的对比度(WCAG 建议至少 4.5:1 对于正文文本)。
13) 测试清单(发送前务必逐项验证)
-
发送到 Gmail(网页版)并查看桌面与移动显示。
-
发送到 Outlook 桌面(Windows)查看 VML 按钮、圆角、字体行高。
-
发送到 Outlook.com(网页版)和 Office365 邮箱。
-
发送到 iPhone Mail(iOS)与 Android 邮件客户端(原生 & Gmail App)。
-
预览文本在收件箱列表是否按预期显示。
-
所有图片在网络较慢的环境下是否有替代
alt
文字可读。 -
点击 CTA 在各种客户端里能否打开链接(是否有被邮件安全网关拦截)。
-
检查退订链接是否能正确访问。
14) 常见故障速查(遇问题先看这)
-
暗黑模式下颜色被反转:尽量使用较强对比的按钮与文本颜色,或在邮件主体中避免浅灰背景 + 白色文本等脆弱配色。
-
Gmail 显示"此邮件已被截断/clipped":页面过大(> ~102KB),移除不必要注释与多余 CSS,压缩图片和 HTML。
-
Outlook 文本间距异常 :检查
<p>
的margin
,优先使用<td>
的padding
。 -
按钮在 Outlook 无背景 :确保使用 VML 代码段,且条件注释语法正确(
<!--[if mso]>
以及<![endif]-->
)。
15) 总结
-
邮件开发是个细活,每一个像素都可能在不同客户端上表现不同。希望这份模板能为大家节省一些从头摸索的时间,制作兼容性好的HTML邮件需要放弃很多Web开发中的习惯,回归表格布局和內联样式。同时要接受不同客户端的渲染差异,采用渐进增强的思路。
这份模板还有很多可以优化的地方,比如暗黑模式适配、更精细的客户端针对性调整等。欢迎有相关经验的同行一起交流改进建议。