0

电子邮件包含 UTF-8 编码的 XML 文件附件。我正在寻找一种从 ASP.NET/Mono MVC4 应用程序中读取此附件的方法。我尝试按照如何使用 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在下面的消息中显示为XXXLTEC O??xml 变量。正确的结果是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>
4

2 回答 2

1

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

    public string GetBodyAsText()
    {
        return Encoding.UTF8.GetString(Body);
        // Original gets ?? characters instead of unicode ones
        //return BodyEncoding.GetString(Body);
    }
于 2015-01-18T21:06:37.183 回答
0

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

问题是 OpenPOP 假定字符集是 US-ASCII,因为 Content-Type 标头中没有字符集参数,并且它错误地强制文本使用该字符集编码进行转换(而不是在它接受的内容上自由)。

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

于 2015-01-16T19:44:33.497 回答