【发布时间】:2013-04-08 08:51:09
【问题描述】:
我正在尝试使用 SmtpClient 和 MailMessage 类发送包含非 ASCII 字符的电子邮件。
我正在使用外部邮件服务 (MailChimp),我的一些电子邮件已被他们的 SMTP 服务器拒绝。我已经联系了他们,他们是这样回复的:
似乎主题行是 Base64 编码,然后是 Quoted-Printable 编码,这通常应该没问题,但其中一个字符被分成两行。因此,当您的主题行有点长时,为了正确处理,它被分成两行。在主题行中使用 UTF-8 引用可打印时,不应在行之间断开字符串。相反,应该缩短一行,以便完整的字符串保持在一起。在这种情况下,这不会发生,因此表示单个字符的字符串被分成多行,因此不是有效的 UTF-8 可引用打印编码。
有问题的主题如下:
Subject: XXXXXXX - 5 personnes vous ont nommé guide
在 UTF-8/Base64 中是这样的:
Subject: WFhYWFhYWCAtIDUgcGVyc29ubmVzIHZvdXMgb250IG5vbW3DqSBndWlkZQ==
由于该标头会超过某个最大长度(我不确定是 Quoted-Printable 编码及其每行 76 个字符的限制,还是 SMTP 标头限制),在编码和拆分后,标头将变为:
Subject: =?utf-8?B?WFhYWFhYWCAtIDUgcGVyc29ubmVzIHZvdXMgb250IG5vbW3D?=
=?utf-8?B?qSBndWlkZQ==?=
显然这在解码时会导致问题(因为第一行无法解码为有效字符串)。我不确定我是否完全理解了这个问题,我有以下问题:
- 为什么是 ?utf-8?B?部分重复? QP编码不应该在分割线之前发生,因此它的标题不应该重复吗?
- QP 解码后,我们不应该得到一个有效的 1 行 Base64 字符串吗?
- 第二行开头有一个空格,超出了 QP 编码,这可能是问题吗?
- 是编码器坏了,还是解码器坏了?
另请注意,其他一些 SMTP 服务器会接受此消息,但这并不意味着它是有效的。
作为一种解决方法,我尝试禁用 Base64 编码,这显然是不必要的,但是 MailMessage 类有一个 BodyTransferEncoding 属性来控制这种编码,但仅适用于邮件的正文部分。似乎没有属性可以控制主题的“传输”编码。
【问题讨论】:
-
这里有同样的问题。当邮件主题标头使用 Base64 或 QuotedPrintable (EncodedWord RFC2047) 编码时,我可以重现它
标签: .net smtp mailchimp mandrill