引用的可打印 MIME 消息中的 CRLF

Posted

技术标签:

【中文标题】引用的可打印 MIME 消息中的 CRLF【英文标题】:CRLF in the quoted-printable MIME message 【发布时间】:2018-11-23 01:50:41 【问题描述】:

我有一个多部分 MIME 消息,其中一部分看起来像

------=_Part_901_990681075.1528833507
Content-Disposition: attachment; filename="metadata.txt"
Content-ID: 3314a2d3-6092-48c3-93d9-a45648b6582b@localhost
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

version: 1.0=0Aid: 13848078-9bc3-4ec1-8cb0-3ee07d74f1cb=0Auser: givenName=
=3DJohn; middleName=3DJacob; surname=3DDoe; dateOfBirth=3D=0A=3D1970-01-01;=
gender=3DM; postalCode=3D12345

但收件人说这是格式错误的元数据部分,因为 =0A 应替换为真正的 CRLF。

我知道它是 quoted-printable 编码的 CRLF 表示,但这不是收件人所期望的。

为了创建元数据部分,我使用了 php 代码:

$sMetadata = "version: 1.0
id: $sTrancasctionId
user: givenName=$sUserFirstName; middleName=$sUserMiddleName; surname=$sUserLastName; dateOfBirth=
=$sUSerDOB; gender=$sUserGender; postalCode=$sUserPostalCode";

然后我使用现有的MailSo 框架将其添加到现有的消息对象中。

关于这个问题的任何提示?

【问题讨论】:

那么 CRLF 实际上是 =0D=0A=0A 只是 LF。您创建此消息的代码是什么样的? @vstm 我已经更新了 OP 您可以尝试在元数据部分之后直接添加$sMetadata = preg_replace('/\R/', "\r\n", $sMetadata);。这会用 CRLF 替换所有换行符。 @vstm 几乎就在那里 - 它可以解决问题,但有一次是添加 CRLF 两次。您可以将其发布为答案。谢谢! 【参考方案1】:

如 cmets 中所述,=0A 仅表示 CRLF 的换行 (LF) 部分。因此,代码很可能与仅由 LF 组成的 Unix 换行符一起存储,而 MIME 表示需要 CRLF。

$sMetadata 行之后直接使用此命令,您可以将所有换行符转换为CRLF:

$sMetadata = preg_replace('/\R/', "\r\n", $sMetadata);

【讨论】:

正则表达式部分会比/(\r\n|\r|\n)/ 更好(涵盖所有内容)吗?还是大写 \R 匹配所有形式的换行符/回车符/回车符?我承认我并不是非常精通每一个可能的正则表达式标志。 @IncredibleHat:是的 \R 匹配 "all" newline combinations。 很高兴知道!每天学习新东西;)(我疯了,但谷歌不喜欢 \R 作为输入哈哈)。谢谢。

以上是关于引用的可打印 MIME 消息中的 CRLF的主要内容,如果未能解决你的问题,请参考以下文章

将 8 位 MIME 消息转换为引用打印

在 Swift 中解码引用的可打印消息

mime decode pdf 引用可打印

Android Studio/gradle 错误消息:无法访问 javax.naming.referenceable 中的可引用

csharp CS:解码引用具有特定编码的可打印文本

Perl MIME::Tools - CRLF 更改为 LF