【问题标题】:Save .msg in C# with Outlook Interop: Correctly display Special Characters (UTF-8)使用 Outlook 互操作在 C# 中保存 .msg:正确显示特殊字符 (UTF-8)
【发布时间】:2021-02-18 07:01:52
【问题描述】:

我的 C# 控制台应用程序正在从 .csv 文件中读取收件人,该文件以 UTF-8 字符集保存并包含特殊字符(中文字母、ö、ä 等)。现在通过创建 MailItem 并在设置 MailItemObject.To 和 MailItemObject.Body 并使用 MailItemObject.SaveAs 后生成 .msg 文件工作正常,但无法正确显示特殊字符。

Windows 资源管理器中的文件如下所示:

而正文只是忽略了特殊字符:

读取/写入 .csv 文件时,我使用的是 Streamwriter/Streamreader,并且可以设置 Encoding.UTF8,它也可以正常工作。 此控制台应用程序还从 .csv 文件读取的数据生成 .xlsx 文件,这也可以正常工作。

我的代码:

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");

非常感谢任何帮助。谢谢!

编辑:如果我将像“ö”这样的特殊字符硬编码到源代码中,它会在文件名和邮件正文中正确显示。这对我的问题有帮助吗?如果是这样,有人能指出我正确的方向吗?

【问题讨论】:

  • 这不是你的问题,我只是想让你知道 String.Join。它使用oMsg.To = String.Join(';', recipients)+"; "; 这样的分隔符将多个字符串合并为一个。
  • ^^ 还有Path.Combine ...
  • docs.microsoft.com/en-us/dotnet/api/… 可以将 type 参数作为 olMSGUnicode 。你试过吗?
  • 我尝试设置 oMsg.SaveAs(path + recipientnames[0] + ".msg", Outlook.OlSaveAsType.olMSGUnicode);但遗憾的是它没有用。

标签: c# utf-8 outlook interop special-characters


【解决方案1】:

根据经验,只有在某个特定字段中存在特殊字符时,MailItem 才会以 UTF-8 保存,否则,mailItem 会以 US-ASCII 保存..

我们使用了一种解决方法,在主题末尾添加了一个不可见的特殊字符 (alt + 0160 | )

【讨论】:

  • 为什么不简单保存为 olMsgUnicode 格式?
猜你喜欢
  • 2015-08-27
  • 2012-01-11
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多