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

时间:2015-01-14 18:00:39

标签: c# utf-8 email-attachments pop3 openpop

电子邮件包含UTF-8编码的XML文件附件。 我正在寻找一种方法来阅读ASP.NET /Mono MVC4应用程序中的这个。 我尝试使用openpop,如How to save email attachment using 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字符串重音字符被转换为丝束?分数。 下面的消息中的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>

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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