IIS6 SMTP发送HTML邮件被自动插入空格换行致样式错乱
问题根因
这是Windows下IIS SMTP搭配CDO组件发送HTML邮件的经典已知问题,核心触发原因是SMTP协议的单行长度限制:
- 按照SMTP协议RFC规范,单行文长度不得超过1000个字符(含换行符),超出阈值后传输层会强制对内容做硬折行处理
- 你服务端生成的HTML文件大概率做了压缩处理,把结构、内联样式全堆在同一行,长度远超1000字符限制
- 强制折行刚好落在
<和table标签名中间时,就会插入空格/换行,直接破坏HTML标签结构,导致样式错乱 - 本地读取文件时检测不到异常属于正常情况:问题发生在CDO组装邮件MIME内容、或者IIS SMTP做传输编码的阶段,和你用FSO还是ADO Stream读取文件没有关系,换读取方式自然解决不了问题。
- 最稳妥的长期方案:主动给HTML内容加合理换行
生成myFile.html时不要把所有代码压缩成单行,在块级标签闭合、属性结束的位置主动加\r\n换行,保证每一行长度都远低于1000字符,从根源避免触发强制折行。这个方案兼容性最好,所有邮件客户端都不会出现兼容问题。 - 代码层面快速修复:给CDO设置正确的传输编码
在调用objMail.Send之前加上两行配置,让CDO主动用quoted-printable编码处理HTML内容,折行时不会破坏标签结构:' 替换为你实际使用的字符集,比如gb2312 objMail.HTMLBodyPart.Charset = "utf-8" objMail.HTMLBodyPart.ContentTransferEncoding = "quoted-printable" - 若以上方案都不适用,可以替换掉IIS6自带的SMTP服务,改用其他对MIME编码处理更规范的邮件发送组件/服务,但改造成本更高,不做优先推荐。
验证方法
直接打开收到的异常邮件的原始源码(所有主流邮件客户端都自带「查看原始邮件」入口),就能看到被插入空格的< table>损坏标签,且折行位置基本都在单行接近1000字符的位置,规律非常明显。
修复方案
按改造成本从低到高选择即可:
补充说明:你之前加的
< table检测逻辑放在文件读取阶段永远抓不到异常,因为损坏的标签是在文件读取完成、内容交给CDO处理之后才产生的,要做检测需要在调用Send方法前把strBody输出到本地文件校验,或者抓取SMTP传输的原始报文排查。
内容的提问来源于stack exchange,提问作者ionalchemist
相关产品推荐
相关产品推荐

