为啥 Outlook 2010 会破坏我的 HTML 电子邮件正文?

Posted

技术标签:

【中文标题】为啥 Outlook 2010 会破坏我的 HTML 电子邮件正文?【英文标题】:Why does Outlook 2010 break my HTML email body?为什么 Outlook 2010 会破坏我的 HTML 电子邮件正文? 【发布时间】:2014-12-17 10:37:54 【问题描述】:

每当我从我自己的服务器(使用我自己的电子邮件程序代码)向 Outlook 2010 发送 html 电子邮件时,它都会删除每个 HTML 属性的前 2 个字符。

这是来自 HTML 正文的 sn-p(请参阅表格属性被搞砸了):

<table cellpadding=" cellspacing=" border=" class=ostdata">  
<thead>                               
<tr>                                       
<th>Field</th>                                 
<th>Value</th>                               
</tr>     
</thead>
<tr>                
<th>Test</th>  
<td>Hello world!</td>
</tr>
</table>

来自 Outlook 2010 的完整 HTML 正文:

<style> BODY     font-family:Arial,Helvetica,Tahoma,sans-serif;font-size:12px;font-weight:normal;color:#4F4F4F;margin:8px;padding:0      H1                           font-size:14px;font-weight:bold;margin-top:18px .postdata                                                                                             margin:10px;padding:10px 0 .postdata TABLE                                  font-family:Arial,Helvetica,Tahoma,sans-serif;font-size:12px;font-weight:normal;color:#4F4F4F            .postdata TH                                                           font-weight:bold;color:#FFF;text-align:left;padding:4px 8px;background-color:#555                .postdata TD                                                      padding:4px 8px           .postdata THEAD TH        font-size:0.85em;font-weight:normal;text-transform:uppercase;background-color:#444 .signature                                                                     color:#9F9F9F;margin:40px 0 10px 0</style>Test email with single <table style=olor: red" width=00%"><tr><td>Table data</td></tr></table><table cellpadding=" cellspacing=" border=" class=ostdata">  <thead>                               <tr>                                       <th>Field</th>                                 <th>Value</th>                               </tr>     </thead><tr>                <th>Test</th>  <td>Hello world!</td></tr></table>

来自 Outlook 2010 的标题(我无法在 Outlook 2010 中查看整个源):

Return-Path: <REMOVED>
Delivered-To: REMOVED
Received: (qmail 31757 invoked by alias); 22 Oct 2014 02:50:45 -0000
Delivered-To: alias-localdelivery-REMOVED
Received: (qmail 31751 invoked by uid 102); 22 Oct 2014 02:50:45 -0000
Date: 22 Oct 2014 02:50:45 -0000
Message-ID: <20141022025045.31750.REMOVED>
To: REMOVED
Subject:
From: REMOVED
X-Mailer: MailBot version 1.24
MIME-Version: 1.0
Content-Type: multipart/alternative;
                boundary="MailBot=="

使用 Mac Mail 7.3 打开时的完整 HTML 电子邮件:

Return-Path: <REMOVED>
Delivered-To: REMOVED
Received: (qmail 32582 invoked by alias); 22 Oct 2014 02:57:39 -0000
Delivered-To: alias-localdelivery-REMOVED
Received: (qmail 32579 invoked by uid 102); 22 Oct 2014 02:57:39 -0000
Date: 22 Oct 2014 02:57:39 -0000
Message-ID: <20141022025739.32578.REMOVED>
To: REMOVED
Subject: 
From: REMOVED
X-Mailer: MailBot version 1.24
MIME-Version: 1.0
Content-Type: multipart/alternative;
    boundary="MailBot=="

This is a multipart message in MIME format.

--MailBot==
Content-Type: text/plain;
    charset="us-ascii"
Content-Transfer-Encoding: 7bit

Test email with single

--MailBot==
Content-Type: text/html;
    charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<style> BODY    font-family:Arial,Helvetica,Tahoma,sans-serif;font-size:12px;font-weight:normal;color:#4F4F4F;margin:8px;padding:0    H1      font-size:14px;font-weight:bold;margin-top:18px .postdata                     margin:10px;padding:10px 0 .postdata TABLE            font-family:Arial,Helvetica,Tahoma,sans-serif;font-size:12px;font-weight:normal;color:#4F4F4F .postdata TH                font-weight:bold;color:#FFF;text-align:left;padding:4px 8px;background-color:#555 .postdata TD                padding:4px 8px   .postdata THEAD TH  font-size:0.85em;font-weight:normal;text-transform:uppercase;background-color:#444 .signature                 color:#9F9F9F;margin:40px 0 10px 0</style>Test email with single <table style="color: red" ><tr><td>Table data</td></tr></table><table cellpadding="0" cellspacing="1" border="0" class="postdata">   <thead>     <tr>            <th>Field</th>          <th>Value</th>      </tr>   </thead><tr>    <th>Test</th>   <td>Hello world!</td></tr></table>

--MailBot==--

Outlook 为什么要这样做?

【问题讨论】:

【参考方案1】:

症状与声明 Content-Transfer-Encoding: quoted-printable 一致,但实际上并未使用此编码,并且您发布的标头似乎证实了这一点。

在 QP 中,您将有 attribute=3D"value",因为等号是此编码中的元字符,需要编码为 =3D。可以理解(尽管可以说不完全正确)一个等号序列后跟两个非十六进制(和非换行符)字符被 Outlook 丢弃为非法。

无论如何,我会责怪您的发送代码(您没有显示),而不是 Outlook(尽管我个人认为应该出于其他原因禁止 Outlook)。

【讨论】:

在阅读您的答案之前,我实际上想出了这个解决方案,但您是完全正确的。我将编码更改为 7bit 并且它起作用了。 这是一个完美的解决方案,只要您可以保证您的数据不包含任何超长行(限制在 1000 字节左右 IIRC 左右),或者显然是任何 8 位数据。如果这些约束并不完全舒适,那么实际实施 QP 实际上可能是最简单、侵入性最小的修复方法,因为它可以让您摆脱对实际内容的任何约束。

以上是关于为啥 Outlook 2010 会破坏我的 HTML 电子邮件正文?的主要内容,如果未能解决你的问题,请参考以下文章

为啥触摸事件会破坏我的 Android 帧率?

为啥我的 ASP.NET 页面会在 html 元素 ID 中添加前缀“ctl00_ctl00”并破坏设计?

在 Outlook 2010 中打破 html 电子邮件中的长词

为啥添加 DataTables 会破坏我的页面? [关闭]

为啥这个 Python 代码会破坏我的计算机? [关闭]

为啥我的路由在调用破坏函数后会失败?