ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Outlook HTML邮件渲染排查与VBA自动发送实战

Outlook HTML邮件渲染排查与VBA自动发送实战 上周帮同事排查一个邮件模板的显示问题同一份 HTML在浏览器里两栏并排、圆角按钮、渐变背景一切正常一进 Outlook 桌面版就整个散架——两栏挤成一栏按钮退化成没有底色的蓝字图片还莫名其妙放大了两成。这种浏览器里是西施、Outlook 里是东施的场面我前后撞过不下十次。outlook 邮件插入 HTML 格式内容调试 这件事本质上不是写邮件而是在一个基于 Word 排版内核的老式浏览器里写网页你习以为常的那些现代 CSS在这里大半是无效的。这篇内容我按自己实际干活的顺序梳理先说清楚 Outlook 到底吃哪一套规矩再给一份可以直接抄的最小模板接着讲 VBA 自动发送时怎么断点调试、中文怎么不乱码最后把踩过的坑整理成速查表。适合三类人看——做企业邮件模板的前端、用 Excel VBA 批量发通知的运营或行政、以及被邮件里样式失效折磨过、想搞明白根因的任何人。你不需要精通 CSS但要能看懂 HTML 标签和基本的 VBA 过程。1. Outlook 里 HTML 邮件为什么总是变脸1.1 三个高频翻车现场先对号入座第一个现场是布局塌陷。你在模板里写了float:left或者display:flex浏览器里左右两栏漂漂亮亮Outlook 里直接变成上下堆叠而且顺序还随机。原因是 Word 排版内核根本不实现 CSS 盒子模型的浮动和弹性布局它只认表格。凡是用 div 撑起来的多列结构在 Outlook 桌面版里基本没有生还概率。第二个现场是样式静默失效。border-radius写了不报错但圆角没了background-image写了不报错但背景图不显示max-width写了不报错但容器该多宽还多宽600 像素的邮件在 1080 屏上能拉满整屏。这类问题的恶心之处在于——没有任何错误提示你只能靠肉眼比对。第三个现场是尺寸与间距漂移。这个最隐蔽。图片在浏览器里宽 200 像素在 Outlook 里变成 240 像素段落之间本来紧贴Outlook 里凭空多出十几像素的空隙行高设置 24px实际渲染出来是 1.2 倍字体高度的自动值。很多人第一反应是我写错了其实代码没错是渲染引擎按另一套默认值在算。注意判断问题的第一原则是——先确认到底是代码写错了还是Outlook 不支持。前者改代码后者改写法。混在一起查能查到你怀疑人生。1.2 我的调试思路从渲染引擎倒推代码写法我处理这类问题的固定动作是分层拆解一层层往下剥不要一上来就改代码。第一层是结构层看 HTML 标签本身有没有问题比如是不是用了 div 布局、是不是漏了表格的cellpadding0 cellspacing0。第二层是样式层看 CSS 属性在 Outlook 支持清单里有没有。第三层是传输层看编码、邮件体积、外链资源能不能被加载。第四层才是客户端差异层看是哪个版本的 Outlook、是桌面版还是网页版。这个顺序很重要因为排查成本是从低到高的。改一个标签三十秒抓一次源码三分钟跑一轮多客户端测试半小时。你要是先去做多客户端测试最后发现只是漏写了一个bgcolor那半天就白费了。还有一个心态上的坎必须迈过去不要试图修复Outlook。网络上有些方案教你上 hack、上条件注释强行让 Outlook 支持某些属性绝大多数时候是给自己挖坑因为 Outlook 版本一更新就崩。正确的思路是——用 Outlook 本来就支持的写法把效果表达出来。想通这一句你做邮件模板的效率会翻好几倍。圆形头像不好做那就用方形或圆角图片。渐变色实现不了那就用一张切好的图片加纯色兜底。设计稿是要妥协的跟渲染引擎较劲不划算。1.3 调试工具链清单别用错家伙工欲善其事我把手头常用的东西列一下都很普通但缺一不可。浏览器用来做第一轮验证——如果浏览器里都错了那跟 Outlook 没关系先改代码。Outlook 桌面版是主战场必须装在你本机因为要反复本地渲染看效果。一个干净的测试收件账号很关键用 QQ 邮箱或者公司测试邮箱都行别拿自己主账号做实验几十封测试邮件塞满收件箱很烦。VBA 编辑器是自动化发送时的调试利器AltF11 打开F8 单步执行CtrlG 调出立即窗口打印变量。一个能显示文件编码的文本编辑器比如 VS Code 右下角能看到 UTF-8 还是 GBK用来确认 HTML 文件本身的编码中文乱码九成出在这里。最后如果条件允许可以挂一个第三方邮件渲染测试服务一次性看十几个客户端的效果截图但那属于锦上添花本地这几样先把问题解决八成。2. 搞懂 Outlook 的渲染内核它到底吃哪一套2.1 Word 引擎和 WebKit 引擎差别比你想的大从 Outlook 2007 开始微软把 HTML 邮件的渲染引擎换成了 Word 的排版组件。这个决定在当时被骂得很惨但一直沿用至今Outlook 2019 和 Microsoft 365 桌面版的 Windows 客户端用的还是这套东西。也就是说你写的 HTML 不是交给浏览器解析的是交给一个为了排版 Word 文档而生的引擎去解析的。它认识表格、认识内联样式、认识基础字体和颜色但它不认识 CSS3 的一大半东西。对照一下就很清楚了。现代浏览器以及苹果邮件、Gmail 这类基于 WebKit 或 Blink 的客户端支持浮动、弹性布局、绝对定位、圆角、阴影、渐变、动画、媒体查询。Word 引擎支持的清单短得多表格布局、内联 style、基础盒模型仅有 padding 和部分 margin、bgcolor属性、align属性、基础字体属性、条件注释、mso-前缀的私有属性。这个清单你背下来写模板时脑子里就有红线了。最能说明问题的是间距。浏览器里p标签默认有上下 marginWord 引擎对p的处理是每个段落之间加一段固定空白你写margin:0有时候也压不掉必须用mso-line-height-rule:exactly配合具体的 line-height 值才能压住。我一般直接放弃p正文全部用td承载间距用 padding 精确控制这样在两端表现基本一致。2.2 各客户端 CSS 支持度对照表下面这张表是我这些年积累下来的按能不能放心用分成三档你可以直接当军规执行。特性Outlook 桌面版Word 引擎Outlook 网页版 / 苹果邮件建议表格布局完整支持完整支持放心用这是唯一稳妥的布局方式float/flex/grid不支持支持绝对不要用position定位不支持支持不要用border-radius不支持支持用切图或直接接受直角box-shadow不支持支持不要用用边框代替线性渐变linear-gradient不支持部分支持用背景图 纯色兜底background-image部分支持时好时坏支持尽量避免或配合 VML 兜底max-width不支持支持用固定宽度的表格代替内联style完整支持完整支持主力手段全部内联style块部分支持可能被剥离支持只用来放字体兜底关键样式仍要内联媒体查询media不支持支持可写但只当增强不能当依赖Web 字体font-face不支持部分支持用系统字体栈兜底mso-私有属性支持忽略专门给 Outlook 打补丁用看完这张表你会发现能走的路其实很窄表格 内联样式 固定宽度。窄归窄但足够做出体面的邮件了九成的商务通知邮件、订单确认、验证码邮件用这套组合完全够。2.3 几个必须彻底放弃的属性以及替代方案光知道不支持还不够得知道那怎么办。我把最常见的五个替代关系列出来这是实打实能救命的。第一float:left做两栏换成外层表格一行两列。给两个td分别设width50%和valigntop中间用一列空白td做间隔。这是最古老也最有效的方法十几年没变过。第二max-width:600px; margin:0 auto做居中限宽换成外层 100% 宽表格 内层 600 像素固定宽表格 aligncenter。注意margin:0 auto在 Outlook 里是无效的aligncenter这个 HTML 属性才有效。而且居中容器外面最好再套一层条件注释的幽灵表格下面讲模板的时候会演示。第三圆角按钮换成**td bgcolor加内边距加a**。外层 td 负责底色和点击区域的 padding内层 a 标签只负责文字颜色和下划线控制。这里有个坑——td 的 padding 在 Outlook 里偶尔会失效所以要额外加一句mso-padding-alt:12px 28px把内边距重复声明一次。第四text-indent和复杂的文字排版换成分段 手动空格或内边距。Word 引擎对 text-indent 的处理很怪做首行缩进建议直接用nbsp;nbsp;或者给 td 加 padding。第五垂直居中vertical-align:middle换成valignmiddle属性。CSS 那套在表格单元格里有时候算不对HTML 属性反而稳。3. 手写一个可复现的最小 HTML 邮件模板3.1 骨架结构外层居中内层固定宽全部表格化我平时用的骨架是这个样子的你可以直接复制走。它包含三层结构最外层是 100% 宽的全屏背景表格中间层是居中用的单元格最内层是 600 像素固定宽的白色内容表格。三层各有分工缺一层都会在某个客户端上出问题。!DOCTYPE html html langzh-CN head meta charsetutf-8 meta http-equivX-UA-Compatible contentIEedge meta nameviewport contentwidthdevice-width, initial-scale1 title订单已确认/title style body { margin:0; padding:0; background-color:#f4f5f7; } table { border-collapse:collapse; } img { border:0; outline:none; text-decoration:none; display:block; } /style !--[if mso] style body, table, td, p, a { font-family:Microsoft YaHei, Arial, sans-serif !important; } /style ![endif]-- /head body table rolepresentation width100% cellpadding0 cellspacing0 border0 stylebackground-color:#f4f5f7; tr td aligncenter stylepadding:24px 12px; !--[if mso] table rolepresentation width600 cellpadding0 cellspacing0 border0 trtd ![endif]-- table rolepresentation width600 cellpadding0 cellspacing0 border0 stylewidth:600px; background-color:#ffffff; border-collapse:collapse; tr td stylepadding:32px 28px 0; font-family:Microsoft YaHei,Arial,sans-serif; font-size:22px; line-height:30px; color:#1a1a1a; mso-line-height-rule:exactly; 订单已确认 /td /tr tr td stylepadding:16px 28px 0; font-family:Microsoft YaHei,Arial,sans-serif; font-size:15px; line-height:24px; color:#444444; mso-line-height-rule:exactly; 你好你的订单已经生成点击下方按钮查看详情。 /td /tr tr td alignleft stylepadding:24px 28px 0; table rolepresentation cellpadding0 cellspacing0 border0 tr td aligncenter bgcolor#2f6fed stylepadding:12px 28px; mso-padding-alt:12px 28px; a hrefhttps://example.com/order styledisplay:inline-block; font-family:Microsoft YaHei,Arial,sans-serif; font-size:15px; line-height:20px; color:#ffffff; text-decoration:none;查看订单/a /td /tr /table /td /tr tr td stylepadding:24px 28px 32px; font-family:Microsoft YaHei,Arial,sans-serif; font-size:13px; line-height:20px; color:#888888; mso-line-height-rule:exactly; 本邮件由系统自动发出请勿直接回复。 /td /tr /table !--[if mso] /td/tr /table ![endif]-- /td /tr /table /body /html3.2 逐行拆解每个属性都在解决一个具体的坑先说rolepresentation。这个属性对 Outlook 没有任何效果但对屏幕阅读器有意义它告诉辅助设备这张表是排版用的不是数据表格。加上去成本为零属于职业习惯。cellpadding0 cellspacing0 border0这三个属性必须写全。这是 HTML 属性而不是 CSS因为Outlook 对表格的默认单元格间距处理得比浏览器更宽。你要是只写 CSS 的border-collapse:collapseOutlook 有时候不认表格边上会多出一圈白边窄屏上看着特别明显。width600和stylewidth:600px同时写这是双保险。Outlook 认 HTML 的 width 属性其他客户端认 CSS 的 width两个都写就不会有一端跑偏。mso-line-height-rule:exactly是给 Outlook 专用的行高修正。默认情况下 Word 引擎会把行高算成字体高度的倍数你写line-height:24px它可能给你渲染成 28px导致文字垂直不居中、段落间距变大。加上这句之后它会乖乖按 24px 算。按钮那块是重点。外层 td 用bgcolor属性设底色不是 CSS 的background-color虽然两个都写更保险内边距用 CSSpadding再补一句mso-padding-alt作为 Outlook 的备用内边距声明。这一套组合下来按钮在各个客户端里都是有底色、可点击、文字居中的方块不会退化成裸链接。3.3 条件注释只给 Outlook 打补丁不污染其他客户端条件注释是 HTML 注释的一种特殊写法只有 Outlook 会执行里面的内容其他客户端当普通注释忽略掉。上面模板里出现了两次!--[if mso]一段在 head 里一段包裹着内层表格。head 里那段的作用是强推字体。Outlook 对字体栈的解析比较粗暴遇到它不认识的字体会往下找但有时候会直接掉到 Times New Roman中文就会渲染成宋体。!important加在字体声明上逼它优先用微软雅黑。注意这段只在 mso 条件下生效不会影响 Gmail 或苹果邮件的字体渲染。表格外面那段的条件注释包裹是为了解决Outlook 在窄容器里的宽度计算问题。当外层 td 的宽度不够精确时内层 600 像素的表格可能被撑破或者被压缩套一层显式的 600 宽度表格就能定死。提示条件注释里的mso是匹配所有走 Word 引擎的 Outlook 客户端包括 2007 到 365 的桌面版。网页版 Outlook 不走这个分支会当作普通注释忽略所以不用额外区分。3.4 内嵌图片cid 引用的正确姿势邮件里的图片有两种放法。一种是用外链img srchttps://你的域名/logo.png简单但收件方的邮件客户端经常会拦截外链图片用户看到的是图片已被阻止。另一种是把图片作为附件嵌入邮件然后用cid:引用这样图片跟着邮件走不会被拦。外链的写法太简单就不说了重点说 cid。用 VBA 发送时要先加附件再把附件的 Content-ID 属性设成你在 HTML 里引用的名字。这里要用到 MAPI 属性访问器属性名是那个固定的一长串十六进制标签。Const PR_ATTACH_CONTENT_ID As String _ http://schemas.microsoft.com/mapi/proptag/0x3712001F Dim att As Object Set att mail.Attachments.Add(C:\mail\logo.png, 1, 0) 1 olByValue att.PropertyAccessor.SetProperty PR_ATTACH_CONTENT_ID, logo_cid附件加完之后HTML 里这样引用img srccid:logo_cid width120 height40 alt公司标识注意两个细节。第一Attachments.Add的第二个参数1表示作为邮件的一部分发送不能省略否则图片会变成普通附件挂在邮件外面。第二width和height必须用 HTML 属性写死因为 Outlook 拿到内嵌图片时按原始像素渲染不写尺寸的话一张 1000 像素宽的图会直接把邮件撑爆。这就是前面说的图片被放大两成的常见来源之一——图片实际像素比设计尺寸大而你没写属性约束。4. VBA 自动发送时的 HTMLBody 调试实战4.1 环境准备账户配置与几行必要的代码用 Excel VBA 通过 Outlook 发信第一步是让 Outlook 里配好一个能发信的账户。以 QQ 邮箱为例网页版邮箱进设置找到账户相关的页面开启 IMAP 和 SMTP 服务按提示生成一串授权码。这串授权码就是待会儿要填的密码不是你的邮箱登录密码两者不一样填错了一定连不上。在 Outlook 里添加账户时选择手动配置收件服务器imap.qq.com端口 993加密方式选 SSL发件服务器smtp.qq.com端口 465加密方式同样选 SSL有些环境用 587 加 STARTTLS 也可以。用户名填完整邮箱地址密码填授权码。配好之后先在 Outlook 里手动发一封给自己确认链路通了再上代码。VBA 里创建邮件对象只要两行Set app CreateObject(Outlook.Application) Set mail app.CreateItem(0) 0 olMailItemCreateItem的参数 0 表示邮件项这个数字别记错1 是约会2 是联系人。4.2 从文件读取 HTML而不是把长字符串硬编码在 VBA 里新手最容易犯的错是把整个 HTML 模板写成 VBA 里的一个超长字符串用引号拼接几十行。这样做的后果是——你想改一个颜色要在引号和符号的迷宫里找半天而且 VBA 编辑器对超长行有长度限制代码会断掉。正确做法是把 HTML 单独存成一个.html文件用 ADODB.Stream 读进来。这个组件的好处是可以显式指定编码为 UTF-8中文不会乱。Dim stream As Object, html As String Set stream CreateObject(ADODB.Stream) stream.Type 2 2 文本模式 stream.Open stream.Charset utf-8 必须在 Open 之后、LoadFromFile 之前设置 stream.LoadFromFile C:\mail\template.html html stream.ReadText stream.Close注意stream.Charset的赋值位置必须夹在Open和LoadFromFile中间。写到前面会报错写到后面读出来还是乱码这个顺序我第一次用的时候折腾了半小时才反应过来。拿到 html 字符串之后赋值给邮件With mail .To testexample.com .Subject 订单已确认 .HTMLBody html .Display 调试阶段用 Display确认无误再换成 .Send End With调试阶段用.Display弹出邮件窗口你能立刻看到渲染效果改代码重新跑就行。等样式全部确认了把.Display换成.Send或者先.Save存到草稿箱再手动发避免半成品直接发出去。4.3 断点、立即窗口、Debug.Print 三件套VBA 编辑器AltF11 打开的调试能力其实够用只要你会用这三样。断点是在代码行左侧灰边上点一下出现红点运行时程序会停在那里。我一般把断点设在.HTMLBody html这一行的前面停下来之后检查 html 变量的内容对不对。立即窗口用 CtrlG 调出来在程序暂停时可以在里面直接输入表达式求值。比如输入? Len(html)看字符串长度输入? Left(html, 200)看开头两百个字符输入? InStr(html, cid:)看有没有 cid 引用。这个窗口是排查变量到底装了什么最快的手段比加 MsgBox 弹窗干净得多。Debug.Print是往立即窗口打日志适合放在循环里。比如批量发信的时候每发一封打一行Debug.Print 已发送 mail.To 时间 Now跑完看一眼就知道哪封出了问题。还有一个容易被忽略的点是错误处理。VBA 默认遇到错误直接弹窗中断批量发送时很烦。在过程开头加On Error GoTo ErrHandler末尾加一段错误处理把错误号和描述打出来就不会因为一封邮件失败导致整批停摆。4.4 中文乱码的根因与修法乱码这事我遇到过的原因有三个按出现频率排序。第一位是HTML 文件本身的编码和读取时声明的编码不一致。文件在编辑器里存成了 GBK代码里却用Charset utf-8去读中文必然花掉。修法是统一到 UTF-8。先用编辑器把文件另存为 UTF-8不带 BOM 更稳代码里也声明 utf-8两边对齐。第二位是HTML 的 meta 标签没写或者写错。meta charsetutf-8必须放在 head 的最前面最好紧跟开头的head。有些客户端会读这个标签来决定怎么解码不写的话它就自己猜猜错就是乱码。保险起见还可以加一句meta http-equivContent-Type contenttext/html; charsetutf-8两种写法的兼容性覆盖更全。第三位是用.Body代替了.HTMLBody。.Body是纯文本属性你给它塞 HTML 源码它会原样当成文字显示标签全都露出来。这个错误很低级但确实常见尤其是从别人的代码里复制粘贴的时候属性名看漏一个字母。注意如果你在 VBA 里用 FSO 的OpenTextFile读文件第四个参数要传-1TristateTrue表示按 Unicode 读传 0 是按 ASCII 读中文直接变问号。这也是一个经典坑。5. 发送链路上的排查从本机到收件方5.1 本机渲染排查先看到源码再说模板显示不对的时候第一件事是拿到 Outlook 实际渲染用的那份 HTML而不是你手上那份。因为 Outlook 在接收的时候可能对 HTML 做了修改——剥掉 style 块、重排表格、插入自己的样式。获取方式有几种。最简单的右键那封邮件另存为.html文件用浏览器打开看一眼源码。另外一种是转发到你自己的另一个邮箱比如 Gmail在网页版里选显示原始邮件能看到完整的 MIME 结构包括 HTML body 的原文。还有一种是直接在 Outlook 里查看邮件属性读因特网邮件头虽然那里主要是头信息但偶尔也能发现编码声明的线索。对比你写的和它收到的两份源码很多问题一眼就能看出来。比如你明明内联了样式收到的版本里 style 属性没了那就说明问题出在传输环节而不是渲染环节。我做过统计大概三成的Outlook 显示异常其实是中间环节改了 HTML跟渲染引擎没关系。5.2 传输与编码环节三个容易忽略的检查点检查点一邮件体积。Gmail 在邮件体积超过 102KB 的时候会把内容截断后面加一个查看完整邮件的链接。Outlook 自己也有大小限制。一个模板里塞五张高清大图很容易就超了。修法是把图片压缩到实际显示尺寸别拿 2000 像素的图去显示 200 像素宽那是浪费带宽也是浪费体积。检查点二外链图片是否被拦。很多企业邮箱默认拦截外链图片用户第一次打开看到的是灰色占位框。如果图片是信息的一部分比如验证码、订单截图建议用 cid 内嵌。如果只是装饰那就在img上加alt属性图挂了至少还有文字。检查点三有没有被自动转成纯文本。有些邮件网关或者收件方的设置会把 HTML 邮件降级成纯文本表现就是标签全裸露出来。这时候检查一下发送时.HTMLBody赋值之后.Body是不是空的——如果只设了 HTMLBody某些老客户端拿不到纯文本兜底。稳妥的做法是同时给.Body赋一份纯文本版本内容一致只是没有格式。5.3 收件端差异同一个模板为什么在别人那儿好好的最后一层是收件端。同一封邮件你发给同事的 Outlook显示正常发给客户的 QQ 邮箱网页版按钮偏移了三像素发给苹果手机自带邮件行距变大。这些都是正常的没有任何一个 HTML 邮件模板能在所有客户端上像素级一致。我的处理原则是设一个可接受的下限文字不能溢出容器图片不能变形按钮不能消失链接必须可点。达成这四条就发。至于圆角有没有、阴影丢了没、配色的细微差异那属于锦上添花不值得为了它去写一堆 hack。另外提一句测试账号的管理。我会准备一组固定账号一个 QQ 邮箱、一个 Gmail、一个公司内网邮箱再加上自己手机上的邮件 App。每做一个新模板先发这一组看一眼截图确认下限达成。这套流程走下来大概十分钟比出事后被业务方投诉要划算得多。6. 常见问题速查表与踩过的那些坑6.1 问题速查表现象最可能的原因排查动作处理办法两栏挤成一栏用了 float 或 flex在 Outlook 里看列是否堆叠改成嵌套表格 两个 td 各占 50%按钮没有底色用了 a 标签的 padding 或背景图看是不是裸链接样式td 上写 bgcolor mso-padding-alt图片被放大图片原始像素大于显示尺寸对比浏览器与 Outlook 的实际宽度img 上加 width 和 height 属性段落间距突然变大用了 p 标签或没写 mso-line-height-rule检查正文容器是不是 td改用 td padding mso-line-height-rule圆角变成直角border-radius 不支持无需排查必然如此用切图或接受直角中文显示为乱码文件编码与声明不一致看编辑器右下角的编码标识统一 UTF-8meta 里声明 charset邮件内容被截断体积超过客户端限制看另存出来的 html 文件大小压缩图片控制在 100KB 以内图片显示为灰色占位外链图片被拦截换一个邮箱再收一次改用 cid 内嵌或加 alt 文字模板下面多出签名Outlook 自动追加默认签名打开邮件看底部是否有签名块临时关闭签名或把签名拼进模板HTML 标签露出来了误用了 .Body 属性检查赋值用的属性名改成 .HTMLBody6.2 几条用血换来的经验第一条先在浏览器里验证再去 Outlook 里验证。听起来是废话但我见过太多人一上来就狂改模板适配 Outlook最后发现是 HTML 本身有个标签没闭合。浏览器不报错不代表代码没问题但浏览器都错了那肯定是代码问题。顺序搞反了效率差三倍。第二条模板改完先发给自己别直接发给业务方。这条我吃过教训。有一次改完模板顺手点了个测试发送收件人选错了群组二十几个人同时收到一封排版混乱、写着测试测试的邮件。从那之后我的 VBA 里固定加一段判断If InStr(1, .To, test.) 0 Then Exit Sub调试阶段只允许发给测试域名。第三条模板文件用版本号管理。template_v1.html、template_v2.html改之前先复制一份。CSS 邮件模板最麻烦的地方是改 A 崩 B你改了个 padding结果另一个客户端上的居中断了。留个能回退的版本比事后靠记忆复原靠谱。第四条狠狠克制用新特性的冲动。设计稿上有个漂亮的渐变卡片你心里想着用 background-image 加个兜底色应该没事结果是部分收件人看到灰底白字部分人看到正常渐变。方案的复杂度要和收益匹配一个通知邮件的视觉精度到不了设计稿的程度这是行业现实接受它。第五条注意 Outlook 的签名追加行为。用CreateItem创建邮件并赋值 HTMLBody 时Outlook 有时会把你设置的默认签名也拼进去表现是模板底部多出一大块完全不相干的联系方式。处理方式有两种一是临时进账户设置把签名关掉二是接受它存在然后用mail.HTMLBody html mail.HTMLBody的方式把签名有意识地拼到模板末尾。我一般用第二种把签名做成模板的一部分视觉上更统一。第六条批量发送前一定要测限流。用普通邮箱账号做批量发送服务方是有频率和总量限制的发多了会被临时限制。真要做批量通知规模上去之后应该走企业邮件服务或专业的邮件发送接口。VBA 这条路适合几十封以内的场景比如部门通知、内部报表分发、固定的几个客户确认邮件不要拿它当营销工具使。6.3 我自己的收尾自检清单每次做完一个新模板我会走一遍这个清单大概两分钟能拦下八成问题。第一条HTML 文件编码是 UTF-8 且 meta 声明一致。第二条所有关键样式是内联的不依赖 head 里的 style 块。第三条布局全部是表格没有任何 float、flex、position。第四条所有图片都写了 width 和 height 属性。第五条600 像素的容器外层套了 mso 条件注释的幽灵表格。第六条按钮用的是 td 加 bgcolor 加 mso-padding-alt 的组合。第七条正文全部用 td 承载没有 p 标签裸奔。第八条VBA 里用的是.HTMLBody不是.Body调试阶段用.Display不是.Send。第九条邮件总体积压在 100KB 以内。第十条发给三个不同客户端的测试账号四条下限不溢出、不变形、不消失、可点击全部达成。这套流程跑顺之后做一个新模板从设计到上线大概两小时其中一小时写代码半小时调 Outlook半小时做多端验证。比起我最早那种改一点发一封看一封的蛮干方式效率提升不止一点半点。真正难的不是技术是接受约束。你把渲染引擎的能力边界摸清楚把可用手段列成清单剩下的就是按单子办事不用每次都重新探索一遍。
返回列表