我找到了一个原因加上解决方案/解决方法,我希望其他人可以利用它。
我将 MHT 文件中的 base64 编码 HTML 与直接生成的 HTML4.0 标记进行了比较,发现了一个独特的重复出现的差异。HTML4.0 报告中的每个表格单元格类的定义如下:
.a23c
{
padding-left: 2pt;
padding-top: 2pt;
padding-right: 2pt;
padding-bottom: 2pt;
border: 1pt solid Black;
background-color: #d3d3d3;
vertical-align: top;
text-align: center;
direction: ltr;
layout-flow: horizontal;
writing-mode: lr-tb;
}
但是,当我查看 MHT 文件中解码的 html 时,其中的类有两个额外的属性 - 宽度和最小宽度,例如
.a23c
{
padding-left: 2pt;
padding-top: 2pt;
padding-right: 2pt;
padding-bottom: 2pt;
border: 1pt solid Black;
background-color: #d3d3d3;
vertical-align: top;
text-align: center;
direction: ltr;
layout-flow: horizontal;
writing-mode: lr-tb;
min-width: 28.05mm;
width: 28.05mm;
}
似乎未设置这些属性会导致 Outlook 将表格单元格向下挤压(可能是因为其 HTML 解析器将 100% 宽度定义为大约 80 列限制?)。
因此,知道了这一点,解决方法似乎很清楚:读入生成的 MHT 文件,在其中解码 base64 编码的 HTML 并将其作为邮件正文发送。这实际上似乎有效,并且代码最少:
var decoded_text = new StringBuilder();
using (var reader = new StreamReader(mhtFile))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (line != "Content-Transfer-Encoding: base64") continue;
reader.ReadLine(); //chew up the blank line
while ((line = reader.ReadLine()) != String.Empty)
if (line != null)
decoded_text.Append(Encoding.UTF8.GetString(Convert.FromBase64String(line)));
break;
}
}
我并不完全相信这段代码的健壮性,但目前它似乎工作得很好,所以我将接受这个作为答案。如果任何知识渊博的人最终阅读本文,将很高兴了解更好的解决方案!