2

我正在编写代码来生成报告并通过电子邮件发送。在这种情况下,我试图将报告嵌入为 html 正文,但 Outlook 未正确呈现报告的某些部分。特别是它似乎是引用的可打印编码的伪影。我看不到我的编码文本有任何问题。

我已将问题缩小到以下示例:

Content-Type: multipart/mixed; boundary="===============0525238969=="
MIME-Version: 1.0
Subject: Your Message(s) from 11/15/2018 04:48:45 PM to 11/01/2019 04:48:45 PM
From: test@foo.com
To: test@foo.com,foo@test.com
Date: Fri, 01 Nov 2019 16:48:46 -0500
Content-Disposition: inline

--===============0525238969==
Content-Type: text/html; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable

<br/>
Your report:<br/>
<br/>
<table border=3D1>
<tr><td colspan=3D"11">Found 1 record(s) between 11/15/2018 04:48:45 PM and=
 11/01/2019 04:48:45 PM<br/></td></tr>
</table><br/>
=09=09=09
--===============0525238969==--

将此保存为 *.eml 文件并在 Outlook 中打开,我注意到两个问题:

1)表格单元格内的文本在第二个日期之前有一个等号而不是一个空格:

Found 1 record(s) between 11/15/2018 04:48:45 PM and=11/01/2019 04:48:45 PM
                                                    ^

它应该是这样的:

Found 1 record(s) between 11/15/2018 04:48:45 PM and 11/01/2019 04:48:45 PM
                                                    ^

2)最后有一个“=0”,可能是制表符中的一个伪影,它被编码为=09。自动剥离这些选项卡是有问题的,因为报告是从用户编辑的模板生成的。很难知道制表符在某些情况下是否相关。

实际上,我可以通过在 html 内容的末尾强制添加一个额外的 \n 来解决第二个问题,但我将其包括在此处,以防它与理解上面的问题 #1 有关。

PS我在“eM Client”中加载了文件,它没有遇到这些故障。我倾向于认为这可能是 Outlook 中的一个错误,但如果这是我的错误,它会更简单(而且更有可能)。

4

1 回答 1

2

问题原来是电子邮件内容使用 LF 换行,而不是 RFC 要求的 CRLF。Outlook 显然尝试使用 LF 内容,但有一些错误。

如果您从 Python 生成电子邮件并遇到此问题,请记住您需要将其输出从 LF 转换为 CRLF,然后再将其保存到 .eml 文件或通过 SMTP 传输消息。即使在 Linux 上也是如此,因为规范需要 CRLF。

于 2019-11-09T22:50:45.617 回答