【问题标题】:Recommendations on parsing .eml files in C#在 C# 中解析 .eml 文件的建议
【发布时间】:2010-10-30 12:02:40
【问题描述】:

我有一个包含电子邮件对话的 .eml 文件目录。在 C# 中是否有推荐的方法来解析这种类型的文件?

【问题讨论】:

    标签: c# eml


    【解决方案1】:

    2017 年 8 月添加:查看 MimeKit:https://github.com/jstedfast/MimeKit。它支持.NET Standard,因此可以跨平台运行。

    原答案:我发布了一个示例项目来说明这个答案 to Github

    CDO COM DLL 是 Windows/IIS 的一部分,可以在 .net 中引用。它将提供准确的解析和良好的对象模型。结合对 ADODB.DLL 的引用使用它。

    public CDO.Message LoadEmlFromFile(String emlFileName)
    {
        CDO.Message msg = new CDO.MessageClass();
        ADODB.Stream stream = new ADODB.StreamClass();
    
        stream.Open(Type.Missing, ADODB.ConnectModeEnum.adModeUnknown, ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, String.Empty, String.Empty);
        stream.LoadFromFile(emlFileName);
        stream.Flush();
        msg.DataSource.OpenObject(stream, "_Stream");
        msg.DataSource.Save();
    
        stream.Close();
        return msg;
    }
    

    【讨论】:

    • Ries,我整天都在寻找解决方案,发现许多解析器和 .net 库部分工作。您建议的 Windows 库 100% 有效。这个答案应该排在第一位。
    • 您是否能够在 64 位应用程序中使用它?你在哪里引用了 DLL?
    • 我能够在 Windows 2008 Standard R2 上使用此解决方案,但遗憾的是它不适用于 Windows 2008 Standard(不是 R2)。在 Windows 2008 或 Windows 7 上使用时也会出现许多兼容问题。
    • 可以从“添加引用”对话框中的“COM”选项卡添加对 dll 的引用。它列在“Microsoft CDO for Windows 2000 Library”下。正如 Ries 所说,它包含在 IIS 中。
    • 我得到编译错误 - 'CDO.MessageClass' 类型没有定义构造函数......对于'ADOBD.StreamClass' 类似。有什么想法吗?
    【解决方案2】:

    Follow this link for a good solution:

    文章的总结是4步(下面的第二步在文章中没有但需要):

    1. 添加对“Microsoft CDO for Windows 2000 Library”的引用,该引用可在 Visual Studio“添加引用”对话框的“COM”选项卡上找到。这将在您的项目中添加对“ADODB”和“CDO”的 2 个引用。

    2. 为 2 引用“ADODB”和“CDO”禁用互操作类型的嵌入。 (参考 -> ADODB -> 属性 -> 将“嵌入互操作类型”设置为 False 并对 CDO 重复相同操作)

    3. 在您的代码中添加以下方法:

      protected CDO.Message ReadMessage(String emlFileName)
      {
          CDO.Message msg = new CDO.MessageClass();
          ADODB.Stream stream = new ADODB.StreamClass();
          stream.Open(Type.Missing, 
                         ADODB.ConnectModeEnum.adModeUnknown, 
                         ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified,                                                                         
                         String.Empty, 
                         String.Empty);
          stream.LoadFromFile(emlFileName);
          stream.Flush();
          msg.DataSource.OpenObject(stream, "_Stream");
          msg.DataSource.Save();
          return msg;
      }
      
    4. 通过传递您的 eml 文件的完整路径来调用此方法,它返回的 CDO.Message 对象将包含您需要的所有已解析信息,包括 To、From、Subject、Body。

    【讨论】:

    • 这也能通过EML中包含的Attachment吗?
    【解决方案3】:

    LumiSoft 包含一个Mime parser

    Sasa 还包括一个 Mime 解析器。

    【解决方案4】:

    获得一个像样的 MIME 解析器可能是一种方法。您可以尝试使用免费的 MIME 解析器(例如来自 codeproject 的 this one),但来自代码作者的 cmets 就像这样

    我在这方面的工作大致相同 我在包装类上工作的时间 用于味精文件。差别很大 困难。 EML 包装器在哪里 上课可能要花一天时间阅读 规范并正确,味精包装器 课程花了一周时间。

    让我对代码质量感到好奇。我确信你可以破解一个 mime 解析器,它可以在几天/几小时内正确解析 95% 的电子邮件。我也确信要做好剩下的 5% 需要几个月的时间。考虑处理 S/MIME(加密和签名的电子邮件)、unicode、由行为不端的邮件客户端和服务器产生的格式错误的电子邮件、几种编码模式、国际化问题、确保故意格式错误的电子邮件不会使您的应用程序崩溃等...

    如果您需要解析的电子邮件来自单一来源,那么快速而肮脏的解析器可能就足够了。如果您需要解析来自野外的电子邮件,则可能需要更好的解决方案。

    我会推荐我们的Rebex Secure Mail component,但我相信您使用其他供应商的组件也会获得不错的结果。

    确保您选择的解析器在 Mike Crispin(MIME 和 IMAP RFC 的合著者)准备的臭名昭著的“Mime Torture Sample message”上正常工作。安装包中的testing message is displayed in MIME Explorer sampledownloaded

    以下代码展示了如何读取和解析 EML 文件:

    using Rebex.Mail;
    
    MailMessage message = new MailMessage();
    message.Load("file.eml");
    

    【讨论】:

    • +1 表示“我也确信剩下的 5% 需要几个月的时间”
    【解决方案5】:

    您可能需要一个电子邮件/MIME 解析器。解析所有的 header 字段并不难,但分离出各种 MIME 类型,如图像、附件、各种文本和 html 部分等会变得非常复杂。

    我们使用第三方工具,但市面上有很多 C# 工具/库。在 Google 中搜索免费的 C# 电子邮件 MIME 解析器。就像我得到了这个:

    http://www.codeproject.com/Articles/11882/Advanced-MIME-Parser-Creator-Editor http://www.lumisoft.ee/lswww/download/downloads/Net/info.txt

    【讨论】:

      【解决方案6】:

      我刚刚开始为此使用 Papercut 的 Mime 部分。乍一看,它似乎体面而简单。

          public void ProcessRawContents(string raw)
          {
              // NB: empty lines may be relevant for interpretation and for content !!
              var lRawLines = raw.Split(new []{"\r\n"}, StringSplitOptions.None);
              var lMailReader = new MimeReader(lRawLines);
              var lMimeEntity = lMailReader.CreateMimeEntity();
              MailMessageEx Email = lMimeEntity.ToMailMessageEx();
              // ...
          }
      

      MailMessageEx 当然是从 MailMessage 派生的。)

      【讨论】:

        【解决方案7】:

        试试:

        • febootimail
        • SmtpExpress
        • LinkWS 简报 Turbo
        • emlBridge - 将 eml 文件导入 Outlook 和几乎任何其他电子邮件客户端
        • 时事通讯 2.1 Turbo
        • ThunderStor (emlResender)
        • Ruby(使用eml2mbox)。见jimbob method
        • Evolution - 创建新消息,附加 eml 文件,

        编写程序:

        解决方法:

        • $ 猫邮件.eml |邮件-s -c 但不会解析标题,也不会解析附件。
        • 将它们放入您的 GMail(Firefox 会将它们保存为附件)

        【讨论】:

        • 该问题明确指出了 C# .NET,但您在 Try 部分的回答指向非 C# 解决方案。
        【解决方案8】:

        Aspose.Email for .NET

        Aspose.Email for .NET 是一个组件的集合,用于使用 .NET 应用程序中的电子邮件。它使工作变得容易 具有多种电子邮件消息格式和消息存储文件 (PST/OST) 以及消息发送和接收功能。

        Aspose.Email 可以轻松创建、阅读和操作大量 消息格式,例如 MSG、EML、EMLX 和 MHT 文件无需 安装 Microsoft Outlook。您不仅可以更改消息 内容,还可以操作(添加、提取和删除)附件 来自消息对象。您可以通过添加或 删除收件人、更改主题或其他属性。它也是 通过提供访问权限,您可以完全控制电子邮件 到它的 Mapi 属性。

        无需 Outlook 的 C# Outlook MSG 文件阅读器

        MSGReader 是一个 C# .NET 4.0 库,用于读取 Outlook MSG 和 EML(Mime 1.0) 文件。支持 Outlook 中几乎所有常见的对象。

        【讨论】:

          猜你喜欢
          • 2013-09-30
          • 2012-07-09
          • 2019-02-08
          • 1970-01-01
          • 2019-06-02
          • 2018-06-25
          • 2012-01-19
          相关资源
          最近更新 更多