如何在Outlook中撰写Multipart Mime混合消息以正确显示



我正在使用Java代码来撰写并将电子邮件发送到MS Outlook 365帐户。该消息的组成如下:

  1. 纯文本部分;
  2. html部分仅包含表;
  3. 纯文本部分;
  4. 文件附件。

我希望Outlook将第1-3部分显示为消息主体,最后一部分作为附件。取而代之的是,它仅显示为消息本身的第一部分,并将其余部分作为单独的附件显示。我玩过不同的标题,但结果是相同的。这是MS Stack(Exchange,Outlook等(的某些功能,还是我做错了什么?

原始消息在这里

Date: Mon, 5 Jun 2017 12:01:47 -0700 (PDT)
From: no-reply@example.com
To: consumer@example.com
Message-ID: <some id>
Subject: Test email
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_Part_0_2350964.1496689307498"
------=_Part_0_2350964.1496689307498
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Content before table
------=_Part_0_2350964.1496689307498
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
<html><body><table><tr><td>First parameter</td><td>value</td></tr><tr><td>Second row</td><td>42</td></tr></table></body></html>
------=_Part_0_2350964.1496689307498
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
This content should be placed after table
------=_Part_0_2350964.1496689307498
Content-Type: application/octet-stream; 
    name="report.xls"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="report.xls"
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA
<skipped>
------=_Part_0_2350964.1496689307498--

结果,我仅看到"表格前"行,两个附件,例如" att01.html"one_answers" att02.txt"和我的原始附件" report.xls"。

我在某个论坛上发现了一个相关的主题,说此问题不应该出现以来Outlook 2010左右,但是我可以在桌面应用程序和Web应用程序中的最新版本中看到它。将所有内容放入HTML部分的解决方案需要更多的工作,因为文本部分是由其他组件生成的。

在调查中,看来Outlook 365通过将第一部分视为电子邮件,其余作为附件来处理多部分/混合。

这是技术上的"路 - 法律"行为:相关的RFC仅指出,当身体部位独立并且需要按特定顺序捆绑时,多部分/混合旨在使用。大多数电子邮件客户端将其解释为意味着这些零件都是单个文档的内线小节 - 尤其是这种解释自然而然的网络邮件客户端 - 但是,无论多么强烈的共识,在此RFC中并没有完全指出。

更可疑的是,即使您使用Content-Disposition: inline,这种治疗方法也适用。Outlook似乎在这里尊重RFC。例如,在以下最小示例中,"仅测试123"。将出现在线:

Subject: Testing email
Content-Type: multipart/mixed; boundary="--bound--"
MIME-Version: 1.0
----bound--
Content-Disposition: inline
Testing 123
----bound--
Content-Disposition: inline
Testing 456

一个相当极端的解决方案是将托管移至Microsoft Exchange Server。根据2011年的本文,当使用Multipart/Mixed时,Exchange将纯文本和HTML零件的行业传声解释为表示消息主体的内联部分,并将这种结构传达为MAPI的Outlook。

除此之外,唯一的解决方案似乎是"手动"将可显示的电子邮件零件合并到一个部分中 - 类似:

Date: Mon, 5 Jun 2017 12:01:47 -0700 (PDT)
From: no-reply@example.com
To: consumer@example.com
Message-ID: <some id>
Subject: Test email
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_Part_0_2350964.1496689307498"
------=_Part_0_2350964.1496689307498
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
<html><body>
Content before table
<table><tr><td>First parameter</td><td>value</td></tr><tr><td>Second row</td><td>42</td></tr></table>
This content should be placed after table
</body></html>
------=_Part_0_2350964.1496689307498
Content-Type: application/octet-stream; 
    name="report.xls"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="report.xls"
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA
<skipped>
------=_Part_0_2350964.1496689307498--

注意:我不确定这是您在2017年遇到的相同的问题,因为当前的行为似乎在2022年中期出现。但这绝对是问题,会影响任何在2023年尝试类似的事情的人(基于针对Microsoft 365 Outlook版本2306构建16529.20182 C2R的个人测试(。(

特别是,这显然是为什么我的电子邮件链 - 在我的手机上的三星电子邮件应用程序和Outlook之间弹跳 - 继续失去其历史记录:链条中当前电子邮件之前的任何内容都被视为HTML附件,然后被丢弃,然后被丢弃关于击中答复。欢乐...

您将零件错误分组。它必须是

1. Outer message, multipart/mixed
  2. multipart/related
    2.a text/plain
    2.b text/html
  3. attachment.

最新更新