使用 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 中表示为以下字节序列:0xC3
、0xA4
。使用 8 位时,您的 MIME 数据将是完全相同的字节序列。 quoted-printable
或 base64
等其他传输编码将对这些字节进行不同的编码,例如作为 w6Q=
或 =C3=A4
.
要点是 MIME 字符集 指定字符如何以二进制形式表示,MIME 内容传输编码 指定这些字符如何表示字节在 MIME 文档本身中编码。
至于最佳实践,现代电子邮件服务器和客户端会很乐意处理 8 位编码的电子邮件。尽管如此,习惯还是使用 quoted-printable
或 base64
.
至于双重编码问题,序列 äÄ
双 UTF-8 编码看起来与 ¿½
不同,所以我认为那里有其他问题。我不熟悉 MimeKit,你的代码示例没有包含足够的信息,但如果你用更完整的重现代码更新你的问题,我很乐意更新我的答案。
我们遇到了一些编码问题,特别是在使用 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 中表示为以下字节序列:0xC3
、0xA4
。使用 8 位时,您的 MIME 数据将是完全相同的字节序列。 quoted-printable
或 base64
等其他传输编码将对这些字节进行不同的编码,例如作为 w6Q=
或 =C3=A4
.
要点是 MIME 字符集 指定字符如何以二进制形式表示,MIME 内容传输编码 指定这些字符如何表示字节在 MIME 文档本身中编码。
至于最佳实践,现代电子邮件服务器和客户端会很乐意处理 8 位编码的电子邮件。尽管如此,习惯还是使用 quoted-printable
或 base64
.
至于双重编码问题,序列 äÄ
双 UTF-8 编码看起来与 ¿½
不同,所以我认为那里有其他问题。我不熟悉 MimeKit,你的代码示例没有包含足够的信息,但如果你用更完整的重现代码更新你的问题,我很乐意更新我的答案。