有與你上面MIME片段:(
Content-Transfer-Encoding: 7bit
幾個問題顯然是不正確的,本書雖然這不太可能是問題(MimeKit忽略的7bit
和8bit
值這個原因)。
最重要的,然而,這是事實,charset參數是iso-2022-jp
但內容本身很顯然不是iso-2022-jp
(它看起來像utf-8
)。
當你拿到TextPart.Text
值,MimeKit通過使用Content-Type
標頭中指定的字符集轉換原始流內容來獲取該字符串。如果這是錯誤的,那麼Text
屬性也將具有錯誤的值。
好消息是,TextPart
有GetText方法,允許您指定字符集覆蓋。
我會建議您嘗試:
var text = part.GetText (Encoding.UTF8);
看看是否能工程。
FWIW,iso-2022-jp
是一種強制日語字符變成7bit 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
}
}
編輯是非常... nitpicky? 我不介意,但如果我們要挑剔,我們至少可以讓挑剔一致嗎? 換句話說,MimeKit被編輯爲「MimeKit」一次,但另一個實例保留在原始字體中。 另外,。在一個實例中,eml被挑選爲'.eml',但在隨後的實例中沒有。 謝謝 –