You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IIS6 SMTP发送HTML邮件被自动插入空格换行致样式错乱

问题根因

这是Windows下IIS SMTP搭配CDO组件发送HTML邮件的经典已知问题,核心触发原因是SMTP协议的单行长度限制:

  • 按照SMTP协议RFC规范,单行文长度不得超过1000个字符(含换行符),超出阈值后传输层会强制对内容做硬折行处理
  • 你服务端生成的HTML文件大概率做了压缩处理,把结构、内联样式全堆在同一行,长度远超1000字符限制
  • 强制折行刚好落在<和table标签名中间时,就会插入空格/换行,直接破坏HTML标签结构,导致样式错乱
  • 本地读取文件时检测不到异常属于正常情况:问题发生在CDO组装邮件MIME内容、或者IIS SMTP做传输编码的阶段,和你用FSO还是ADO Stream读取文件没有关系,换读取方式自然解决不了问题。
  • 验证方法

    直接打开收到的异常邮件的原始源码(所有主流邮件客户端都自带「查看原始邮件」入口),就能看到被插入空格的< table>损坏标签,且折行位置基本都在单行接近1000字符的位置,规律非常明显。

    修复方案

    按改造成本从低到高选择即可:

    • 最稳妥的长期方案:主动给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检测逻辑放在文件读取阶段永远抓不到异常,因为损坏的标签是在文件读取完成、内容交给CDO处理之后才产生的,要做检测需要在调用Send方法前把strBody输出到本地文件校验,或者抓取SMTP传输的原始报文排查。

    内容的提问来源于stack exchange,提问作者ionalchemist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 21:03:57