使用 MimeKit/MailKit 的内容编码

Content encoding using MimeKit/MailKit

我们遇到了一些编码问题,特别是在使用 8 位作为内容传输编码时。 首先,谁能告诉我变音符号的 8 位编码值是什么样子的?

实践中处理编码的最佳方法是什么?

我尝试使用 MIME 实体的 WriteTo() 方法将内容写入流中,这在除 8 位编码以外的任何情况下都有效。

更新: 当前使用 MimeKit 示例之一中发布的代码:

using (MemoryStream memStm = new MemoryStream())
{
    mime.WriteTo(memStm);
    message.MimeMessage = Encoding.UTF8.GetString(memStm.ToArray());
}

但是当我的 MIME 包含特殊字符时,它似乎是某种双重编码: 啊啊 将导致类似: ½

我怎样才能避免那些双重编码的情况?

8 位 MIME 传输编码基本上是 "no encoding",因此任何使用 8 位编码编码的 MIME 数据都与给定字符集中数据的二进制表示相同。例如,'ä' 在 UTF-8 中表示为以下字节序列:0xC30xA4。使用 8 位时,您的 MIME 数据将是完全相同的字节序列。 quoted-printablebase64 等其他传输编码将对这些字节进行不同的编码,例如作为 w6Q==C3=A4.

要点是 MIME 字符集 指定字符如何以二进制形式表示,MIME 内容传输编码 指定这些字符如何表示字节在 MIME 文档本身中编码。

至于最佳实践,现代电子邮件服务器和客户端会很乐意处理 8 位编码的电子邮件。尽管如此,习惯还是使用 quoted-printablebase64.

至于双重编码问题,序列 äÄ 双 UTF-8 编码看起来与 ¿½ 不同,所以我认为那里有其他问题。我不熟悉 MimeKit,你的代码示例没有包含足够的信息,但如果你用更完整的重现代码更新你的问题,我很乐意更新我的答案。