如何从 pop3 读取 UTF-8 邮件附件

How to read UTF-8 mail attachments from pop3

电子邮件包含 XML 个 UTF-8 编码的文件附件。 我正在寻找一种从 ASP.NET/Mono MVC4 应用程序中读取此 attahcmed 的方法。 我尝试使用代码

How to save email attachment using OpenPop 中描述的方式使用 openpop
using (OpenPop.Pop3.Pop3Client client = new Pop3Client())
{
    client.Connect("mail.company.com", 110, false);
    client.Authenticate("user", "pass", AuthenticationMethod.UsernameAndPassword);
    if (client.Connected)
    {
        int messageCount = client.GetMessageCount();
        List<Message> allMessages = new List<Message>(messageCount);
        for (int i = messageCount; i > 0; i--)
        {
            var msg = client.GetMessage(i);
            var att = msg.FindAllAttachments(); 
            foreach (var ado in att)
            {
                var xml = ado.GetBodyAsText();

结果 xml 字符串重音字符被转换为 tow ??分数。 下面消息中的 XXXLTEC O=C3=9C 在 xml 变量中显示为 XXXLTEC O??。 正确的结果是 XXXLTEC OÜ

如何正确读取UTF-8附件? 我还没有在 OpenPop 中找到任何选项来正确转换它。

XML 邮件中的附件显示为

------=_NextPart_000_0066_01D0302C.83D6EFA0
Content-Type: text/xml;
    name="tapitolemas.xml"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
    filename="tapitolemas.xml"

<?xml version=3D"1.0" encoding=3D"UTF-8"?>
<E-Document>
  <Header>
    <DateIssued>2015-01-02T13:27</DateIssued>
    <SenderID>-</SenderID>
    <ReceiverID>1COL</ReceiverID>
  </Header>
  <Document>
    <DocumentType>invoice</DocumentType>
    <DocumentFunction>original</DocumentFunction>
    <DocumentParties>
      <BuyerParty context=3D"partner">
        <PartyCode>1COL</PartyCode>
        <Name>XXXLTEC O=C3=9C</Name>

使用 OpenPOP.NET 可能无法解决此问题,因此要使其正常工作,您唯一真正的选择是使用另一个 POP3 库,例如没有此问题的 MailKit

问题是 OpenPOP 假设字符集是 US-ASCII,因为 Content-Type header 中没有字符集参数,它错误地强制文本使用该字符集编码进行转换(而不是在它接受的东西上变得自由。

另一方面,MailKit 使用字符集回退逻辑来尝试确定它是哪个字符集。但即使它默认出错(即 TextPart.Text 属性,你仍然可以使用 TextPart.GetText (System.Text.Encoding encoding) 来覆盖东西)。

这可以通过将 MessagePrt.cs GetBodyAsText() 方法更改为

来解决
    public string GetBodyAsText()
    {
        return Encoding.UTF8.GetString(Body);
        // Original gets ?? characters instead of unicode ones
        //return BodyEncoding.GetString(Body);
    }