如何撰写多部分 MIME 混合消息以在 Outlook 中正确显示

问题描述 投票:0回答:2

我正在使用 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: [email protected]
To: [email protected]
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”和“ATT02.txt”以及我的原始附件“report.xls”。

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

email outlook mime-types mime mime-message
2个回答
0
投票

您对零件的分组不正确。一定是

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

0
投票

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

这是技术上“道路合法”行为:相关RFC仅声明多部分/混合“旨在当身体部分独立且需要以特定顺序捆绑时使用”。大多数电子邮件客户端将此解释为意味着这些部分都是单个文档的内联小节 - 尤其是网络邮件客户端,这种解释对他们来说是自然而然的 - 但是,无论共识多么强烈,在本 RFC 中都没有如此明确地说明。

但更可疑的是,即使您使用

Content-Disposition: inline
,这种治疗方法也适用; Outlook 似乎不尊重此处的RFC。例如,在下面的最小示例中,只有“Testing 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 服务器。根据 2011 年的这篇文章,当使用多部分/混合时,Exchange 采用行业共识的纯文本和 HTML 部分解释来表示邮件正文的内联部分,并通过 MAPI 将此结构传递给 Outlook。

除此之外,唯一的解决方案似乎是“手动”将可显示的电子邮件部分合并为单个部分 - 类似于:

Date: Mon, 5 Jun 2017 12:01:47 -0700 (PDT)
From: [email protected]
To: [email protected]
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 的个人测试)。) 特别是,这显然就是为什么我的电子邮件链(在 Android 内置邮件应用程序和 Outlook 之间来回跳转)不断丢失其历史记录:链中当前电子邮件之前的任何内容都会被 Outlook 视为 HTML 附件,然后在点击回复时被丢弃。喜悦...

© www.soinside.com 2019 - 2024. All rights reserved.