带有特殊字符的电子邮件被拒绝 - RFC-6532 和“quoted-printable”

Posted

技术标签:

【中文标题】带有特殊字符的电子邮件被拒绝 - RFC-6532 和“quoted-printable”【英文标题】:Email with special characters rejected - RFC-6532 and "quoted-printable" 【发布时间】:2021-12-19 14:54:28 【问题描述】:

一家电子邮件提供商拒绝了一封包含特殊字符(例如变音符号)的电子邮件。他们说它们符合 RFC-5321 和 RFC-5322。现在我浏览了这些标准,但是它们不支持国际电子邮件(因此没有变音符号)。仅支持 ASCII-127。 现在有一个名为 RFC-6532 的扩展,用于标准化国际电子邮件。我们的电子邮件采用 UTF-8(可引用打印)编码并发送如下:

"=?UTF-8?Q?B=C3=B6rge_M=C3=B6ller?="<boerge.moeller@foo.org>

这是一个符合 RFC-6532 的地址吗?还是其他一些/较旧的 RFC(如 RFC-2054)?毕竟有太多与邮件相关的 RFC,我可能错过了 10 或 20 个 ;-)

【问题讨论】:

【参考方案1】:

这是在正确的轨道上,但它是错误的。

"=?UTF-8?Q?B=C3=B6rge_M=C3=B6ller?="<boerge.moeller@foo.org>

上面的表格有2个问题:

    编码字(=?UTF-8?Q?...?= 位)被引用,不应该被引用。解析此地址的邮件软件如果符合标准,则不会解码该令牌。 “名称”与尖括号对接,不应如此。必须有空格才能符合标准。

换句话说,这就是它应该的样子:

=?UTF-8?Q?B=C3=B6rge_M=C3=B6ller?= <boerge.moeller@foo.org>

您需要查看的 RFC 是:

RFC5322 - 这定义了您尝试与之交互的服务器实现的现代消息语法。 RFC2047 - 这定义了在诸如Subject 和地址标头(例如 To/From/Cc/Reply-To/etc)等标头中表示非 ASCII 字符所需的编码字的方法和语法。 (这是=?UTF-8?Q?B=C3=B6rge_M=C3=B6ller?= 部分) RFC822 - 这定义了 RFC2047 使用的语法,是 RFC5322 的旧版本。

可能阅读RFC2822 也很有帮助,它比 RFC822 新但比 RFC5322 旧。但是,我的猜测是,您可以跳过它,因为它没有太多价值。 RFC822 仍然有价值的唯一原因是它被 RFC2047 引用的更老的语法定义(例如atomdot-atomphraseangle-addraddr-spectspecials 等)。

RFC6532 甚至比 RFC5322 更新。其目的是通过允许使用 UTF-8 作为替代方案来完全消除对标头编码的需要。

在 RFC6532 之前,除了 ASCII(这是 RFC822 使用的)之外,没有用于标头的字符编码标准,因此所有内容始终假定符合 ASCII。

但是,很多软件不遵循标准,因此现实世界中有很多邮件使用 ISO-8859-1 和阳光下的所有其他字符编码,这一切都取决于所使用的地区用户所在地区以及在这些地区广泛使用的字符编码(例如 Big5 和 GB2312 在中国各地流行,Shift-JIS 在日本流行,EUC-KR/KS-C-5601 -1987 流行于韩国等)。

这导致了重大的互操作性问题,不仅是因为并非每个邮件客户端都可以处理阳光下的每种字符编码,还因为客户端无法确定甚至使用了哪种字符编码!这只是二进制 gobbeldy-gook。

然而,UTF-8 已经存在了很长时间,它可以代表所有语言中的所有字符,因此它最终胜出作为使用的标准字符编码是合乎逻辑的用于国际电子邮件。

【讨论】:

感谢您的澄清。但是“更正”的形式 =?UTF-8?Q?B=C3=B6rge_M=C3=B6ller?= &lt;boerge.moeller@foo.org&gt; RFC-6532 是否符合要求? 您听起来很困惑 :-) RFC5322 是您应该重点遵守的标准。不是 RFC6532。 RFC6532 是一个标准,它说“好吧,只要您使用 UTF-8,就可以不再对您的电子邮件标头进行编码”。 所以再次澄清一下,RFC5322 完全能够容纳任意字符集,但是您必须将它们编码为 ASCII 表示(使用 MIME 编码,例如 RFC2047 用于标头,如图所示回答)。 6532 的承诺是允许您在标头中使用裸 UTF-8;但仍然很少有系统实现这一点。 所以再一次说明已经重复多次的内容,=?charset(*lang)?[BQ]?...?= 编码在 RFC 2047 中定义。 也许还提到 RFC 6532 明确指出 “这种 [RFC 6532] 格式的消息需要使用 SMTPUTF8 扩展 [RFC6531] 才能通过 SMTP 传输。” i> 理论上,您的 MUA 可能会以这种格式提交消息并期望您的 MTA 重新格式化它以进行 7 位传输当且仅当您的本地 ESMTP 服务器宣传SMTPUTF8 支持。

以上是关于带有特殊字符的电子邮件被拒绝 - RFC-6532 和“quoted-printable”的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7 smtplib 如何发送带有错误 13 权限的附件被拒绝?

带有 MySQL 连接器的 C# - 访问被拒绝

来自 Oracle pl/sql 的电子邮件中的特殊字符

HttpClient使用指南——POST请求

PHP电子邮件表单正在通过,单词之间没有空格,也没有特殊字符

Gmail 5.0 应用程序在收到 ACTION_SEND 意图时失败并显示“附件的权限被拒绝”