【问题标题】:Parsing email body with c#使用 C# 解析电子邮件正文
【发布时间】:2013-09-22 12:33:48
【问题描述】:

我有一个名为 email_archive 的电子邮件数据库表。该表包括一个名为 body 的字段和另一个名为 raw_headers 的字段。我想使用 C#(在 SharePoint webpart 中)在屏幕上显示此表的内容。我一直在尝试找到一个可以解析正文的库,以便我可以将消息的部分返回到窗口。我尝试了 Limilabs 的一个库,并下载了其他几个库。但是,所有这些似乎都至少需要 EML 格式的电子邮件。

最近的尝试是尝试使用MailUtilies

MimeMessage mm = new MimeMessage(header + message);

但这失败了,因为格式似乎没有通过 MimeMessage 完整性检查。

有谁知道使用原始标题和正文内容将电子邮件解析为其组成部分的方法。

标题看起来像这样

MIME-Version: 1.0
Received: from server.domain.com (10.20.205.104) by
 mail.domain.com (xx.xx.xx.xx) with Microsoft SMTP Server id
 8.1.436.0; Mon, 16 Sep 2013 14:33:54 -0700
Received: from server (localhost.localdomain [127.0.0.1])   by
 server.domain.com (8.13.8/8.13.8) with ESMTP id r8GLX4vm007046 for
 <myaddress@domain.com>; Mon, 16 Sep 2013 14:33:04 -0700
From: "service@domain.com" <service@domain.com>
To: My Name <myaddress@domain.com>
Date: Mon, 16 Sep 2013 14:33:04 -0700
Subject: Some Topic
Thread-Topic: Some Topic
Thread-Index: Ac6zJHFgOvb7ZAdeTJC8DzqnAvdnOw==
Message-ID: <153372.442207427-sendEmail@gserver>
Reply-To: "service@domain.com" <service@domain.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Exchange-Organization-AuthAs: Internal
X-MS-Exchange-Organization-AuthMechanism: 10
X-MS-Exchange-Organization-AuthSource: mail.domain.com
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
Content-Type: multipart/alternative;
    boundary="_000_153372442207427sendEmailgroundwork_"

消息看起来像这样

--_000_153372442207427sendEmailgroundwork_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Some message to dispaly

--_000_153372442207427sendEmailgroundwork_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html><head><style type=3D'text/css'> p,h1 { font-family: arial; } 
</style></head><body>
 <p>Some message to display</p>
 </body></html>


--_000_153372442207427sendEmailgroundwork_--

【问题讨论】:

    标签: c# parsing mime mime-message


    【解决方案1】:

    我通过使用OpenPop.Net 的库找到了答案。

    public void addMessage(string message, string header) {
      string full_body = header + "\n" + message;
      System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
      Byte[] full_body_bytes = encoding.GetBytes(full_body);
      Message mm = new Message(full_body_bytes);
    
      //do stuff here.
    }
    

    【讨论】:

    • 我们可以使用 OpenPop.Net 来处理 .pdf 、 .xls 、 .doc 和 .txt 等附件文件吗???
    • 是的,我可以保存附件。
    • 我知道我们也可以使用 System.Net.Mail 。那么 Openpop 和这个哪个更容易?
    • 根据我的需要,Openpop 更简单,但我不需要发送消息,只需要检索消息进行归档。
    • @Shyam 您无法使用 System.Net.Mail 解析电子邮件。同样使用 ASCII 编码可能会导致数据丢失。
    【解决方案2】:

    我刚刚使用了MimeKit,它非常适合解析附件。它似乎功能齐全且跨平台。

    【讨论】:

      【解决方案3】:

      您需要将标题和正文与\r\n\r\n 分隔符结合起来。下面的代码证明了这一点:

      string msgContent = header.TrimEnd("\r\n") + "\r\n\r\n" + message;
      byte[] bytes = Encoding.ASCII.GetBytes(msgContent);
      ComponentPro.Net.Mail.MailMessage msg = new ComponentPro.Net.Mail.MailMessage(bytes);
      
      //
      // Access your parsed message here
      //
      

      代码使用Ultimate Mail library

      【讨论】:

        【解决方案4】:

        如果你有标题和正文,重新创建整个 eml 很简单:

        string eml = header + "\r\n\r\n" + body;  
        

        MIME 格式的标题和正文由一个空行分隔。 另一个答案使用 '\n' - 这是不正确的,因为 MIME 需要 "\r\n" 序列作为行尾。

        如果您的标题字符串已经以新行结尾,您只需添加一个新行(“\r\n”)。

        【讨论】:

          猜你喜欢
          • 2018-12-01
          • 2013-11-03
          • 1970-01-01
          • 1970-01-01
          • 2015-06-29
          • 2021-06-14
          • 2021-08-13
          • 1970-01-01
          • 2011-08-28
          相关资源
          最近更新 更多