Я пишу транспортный агент, чтобы изменить текст некоторых писем. Поскольку речь идет только об удалении нескольких простых ключевых слов ascii, я старался не различать разные форматы тела:
EmailMessage message = e.MailItem.Message;
var encoding = Charset.GetEncoding(message.Body.CharsetName);
string body;
using (var reader = new StreamReader(message.Body.GetContentReadStream(), encoding, true))
body = reader.ReadToEnd();
body.Replace("something", "");
using (var writer = new StreamWriter(message.Body.GetContentWriteStream(), encoding))
writer.Write(body);
Это хорошо работает для текстовых и HTML-тел, протестированных с различными кодировками.
Однако для Rtf все специальные символы, такие как немецкие умлауты, ломаются. В этом случае Body.CharsetName
возвращается как "utf-8", что преобразуется в encoding
"System.Text.UTF8Encoding". Но я вижу текст внутри Rtf не UTF8, это ansicpg1252
. Но так как я не касаюсь не ascii символов, почему это важно? Просто читая и записывая поток тела, немецкий Grüße выходит как Gr��e. Когда я не пишу новое тело, оно приходит правильно.
Как я могу сделать это правильно, чтобы оно работало для любого формата тела?