บันทึก .msg ใน C# ด้วย Outlook Interop: แสดงอักขระพิเศษ (UTF-8) อย่างถูกต้อง

แอปคอนโซล C# ของฉันกำลังอ่านผู้รับจากไฟล์ .csv ซึ่งบันทึกด้วยชุดอักขระ UTF-8 และมีตัวอักษรพิเศษ (ตัวอักษรจีน ö ä ฯลฯ) ขณะนี้สร้างไฟล์ .msg โดยการสร้าง MailItem และหลังจากตั้งค่า MailItemObject.To และ MailItemObject.Body และการใช้ MailItemObject.SaveAs ก็ทำงานได้ดี แต่แสดงอักขระพิเศษไม่ถูกต้อง

ไฟล์ใน windows explorer มีลักษณะดังนี้: ป้อนคำอธิบายรูปภาพที่นี่

และร่างกายก็เพิกเฉยต่ออักขระพิเศษ:

ป้อนคำอธิบายรูปภาพที่นี่

เมื่ออ่าน/เขียนไฟล์ .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
^^ และ Path รวม ...   -  person Fildor    schedule 18.02.2021
comment
docs.microsoft.com/en-us/dotnet/api/ สามารถใช้ type param เป็น olMSGUnicode ได้ คุณลองแล้วหรือยัง?   -  person Fildor    schedule 18.02.2021
comment
ฉันพยายามตั้งค่า oMsg.SaveAs(path + allowancenames[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