Сохранение .msg в C# с помощью Outlook Interop: правильное отображение специальных символов (UTF-8)

Мое консольное приложение С# считывает получателей из файла .csv, который сохраняется с кодировкой UTF-8 и содержит специальные символы (китайские буквы, ö, ä и т. д.). Теперь создание .msg-файлов путем создания MailItem и после установки MailItemObject.To и MailItemObject.Body и использования MailItemObject.SaveAs работает нормально, но неправильно отображает специальные символы.

Файл в проводнике Windows выглядит так: введите здесь описание изображения

И тело просто игнорирует специальный символ:

введите здесь описание изображения

При чтении/записи файлов .csv я использую Streamwriter/Streamreader и могу установить Encoding.UTF8, который также отлично работает. Это консольное приложение также генерирует файлы .xlsx из данных, считанных из файлов .csv, и это тоже работает отлично.

Мой код:

Outlook.MailItem oMsg = (Outlook.MailItem)oOL.CreateItem(Outlook.OlItemType.olMailItem);
oMsg.Subject = "Test";

string recipient = "";
foreach (string s in recipients)
{
    recipient += s;
    recipient += "; ";
}
oMsg.To = recipient;

string cc = "";
foreach (string s in incopy)
{
    cc += s;
    cc += "; ";
}
oMsg.CC = cc;

foreach (string s in stringcountries)
{
    for (int i = 0; i < Directory.GetFiles(Directory.GetCurrentDirectory() + "\\outputfiles\\excel", "*" + s + "*").Length; i++)
    {
        oMsg.Attachments.Add(Directory.GetFiles(Directory.GetCurrentDirectory() + "\\outputfiles\\excel", "*" + s + "*")[i]);
    }
}

string body = "";
oMsg.Body = body;
oMsg.SaveAs(path + recipientnames[0] + ".msg");

Любая помощь приветствуется. Спасибо!

РЕДАКТИРОВАТЬ: Если я жестко запрограммирую специальный символ, такой как ö, в исходный код, он правильно отобразится как в имени файла, так и в теле письма. Это поможет моей проблеме? Если да, может ли кто-нибудь указать мне правильное направление?


person MichaelS    schedule 18.02.2021    source источник
comment
Это не касается вашей проблемы, я просто хочу, чтобы вы знали о String.Join. Он объединяет несколько строк в одну с разделителем вроде этого oMsg.To = String.Join(';', recipients)+"; ";.   -  person Palle Due    schedule 18.02.2021
comment
^^, а также Путь. Объединить ...   -  person Fildor    schedule 18.02.2021
comment
docs.microsoft.com/en-us/dotnet/api/ может принимать параметр type как olMSGUnicode . Вы пробовали это?   -  person Fildor    schedule 18.02.2021
comment
Я попытался установить oMsg.SaveAs (путь + имена получателей [0] + .msg, Outlook.OlSaveAsType.olMSGUnicode); но, к сожалению, это не сработало.   -  person MichaelS    schedule 18.02.2021


Ответы (1)


По опыту MailItem сохраняются в UTF-8, только если в одном из определенных полей присутствует специальный символ, если нет, то mailItem сохраняется в US-ASCII.

Мы использовали обходной путь, добавив невидимый специальный символ в конце темы (alt + 0160 | )

person novaXire    schedule 18.02.2021
comment
Почему бы просто не сохранить в формате olMsgUnicode? - person Dmitry Streblechenko; 19.02.2021