在 C# 中解析 .eml 文件的建议

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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步(下面的第二步在文章中没有但需要):

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

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

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

    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;
    
    

    通过传递您的 eml 文件的完整路径来调用此方法,它返回的 CDO.Message 对象将包含您需要的所有已解析信息,包括 To、From、Subject、Body。

【讨论】:

这也能通过EML中包含的Attachment吗?【参考方案3】:

LumiSoft 包含一个Mime parser。

Sasa 还包括一个 Mime 解析器。

【讨论】:

参考用法以防有人查看:github.com/fschwiet/ManyConsole/blob/master/SampleConsole/… 现在在github.com/fschwiet/ManyConsole/blob/master/SampleConsole/…【参考方案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 sample和downloaded。

以下代码展示了如何读取和解析 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 文件,

编写程序:

在 C# 中(参见 [this][4] 和 this)。 请参阅:Source code。 using Rebel Secure Mail library .NET(参见this、this 和this)

解决方法:

$ 猫邮件.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 属性。

http://www.aspose.com/.net/email-component.aspx https://www.nuget.org/packages/Aspose.Email/ 有一个评估版,但有以下限制: http://www.aspose.com/docs/display/emailnet/Licensing

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

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

https://www.nuget.org/packages/MSGReader/ https://github.com/Sicos1977/MSGReader

【讨论】:

以上是关于在 C# 中解析 .eml 文件的建议的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php 中解析 .eml 文件?

从python中的.eml文件解析excel附件

如何用Java解析.eml文件

如何解析带有附件和内联图像的 EML 文件并转换为 HTML

如何解析EML(邮件)格式的文件以及一款小巧的EML邮件阅读工具

c#怎么把mailmessage保存为eml文件?