您的上述 MIME 片段存在一些问题 :(
Content-Transfer-Encoding: 7bit
显然不是真的,尽管这不太可能是问题(MimeKit 忽略7bit
and的值正是8bit
出于这个原因)。
然而,最重要的是,charset 参数是iso-2022-jp
,但内容本身显然不是iso-2022-jp
(看起来像utf-8
)。
当您获取该TextPart.Text
值时,MimeKit 通过使用Content-Type
标头中指定的字符集转换原始流内容来获取该字符串。如果这是错误的,那么该Text
属性也将具有错误的值。
好消息是它TextPart
具有允许您指定字符集覆盖的GetText方法。
我建议尝试:
var text = part.GetText (Encoding.UTF8);
看看这是否有效。
FWIWiso-2022-jp
是一种将日文字符强制转换为 7 位 ascii 形式的编码,看起来像是完全乱码。如果您的日文文本实际上位于以下位置,这就是它的样子iso-2022-jp
:
BE:IU%U%!%$%kL>%F%9%H
这就是我知道它不是iso-2022-jp
:)
更新:
最终,解决方案可能是这样的:
var encodings = new List<Encoding> ();
string text = null;
try {
var encoding = Encoding.GetEncoding (part.ContentType.Charset,
new EncoderExceptionFallback (),
new DecoderExceptionFallback ());
encodings.Add (encoding);
} catch (ArgumentException) {
} catch (NotSupportedException) {
}
// add utf-8 as our first fallback
encodings.Add (Encoding.GetEncoding (65001,
new EncoderExceptionFallback (),
new DecoderExceptionFallback ()));
// add iso-8859-1 as our final fallback
encodings.Add (Encoding.GetEncoding (28591,
new EncoderExceptionFallback (),
new DecoderExceptionFallback ()));
for (int i = 0; i < encodings.Count; i++) {
try {
text = part.GetText (encodings[i]);
break;
} catch (DecoderFallbackException) {
// this means that the content did not convert cleanly
}
}