47

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

4

8 回答 8

67

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

原始答案:我发布了一个示例项目来说明这个对 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;
}
于 2010-07-24T13:20:54.860 回答
12

请点击此链接以获得良好的解决方案:

文章的总结是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。

于 2013-09-26T17:31:23.853 回答
11

LumiSoft包括一个Mime 解析器

Sasa还包括一个 Mime 解析器。

于 2010-05-15T01:30:14.087 回答
4

您可能需要的是一个电子邮件/MIME 解析器。解析所有标题字段并不难,但分离出各种 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

于 2009-06-01T19:53:20.547 回答
4

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

我的工作时间与我为 MSG 文件的包装类工作的时间差不多。难度差别很大。EML 包装类可能需要一天时间来阅读规范并正确处理,而 MSG 包装类则需要一周时间。

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

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

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

确保您选择的解析器在 Mike Crispin(MIME 和 IMAP RFC 的合著者)准备的臭名昭著的“Mime Torture Sample message”上正常工作。测试消息显示在 MIME Explorer 示例中,可以在安装包中下载。

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

using Rebex.Mail;

MailMessage message = new MailMessage();
message.Load("file.eml");
于 2010-01-27T18:33:55.977 回答
3

我刚刚开始为此使用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。)

于 2013-05-31T12:53:59.117 回答
2

Aspose.Email for .NET

Aspose.Email for .NET is a collection of components for working with emails from within your .NET applications. It makes it easy to work with a number of email message formats and message storage files (PST/OST) along with message sending and receiving capabilities.

Aspose.Email makes it easy to create, read and manipulate a number of message formats such as MSG, EML, EMLX and MHT files without the need of installing Microsoft Outlook. You can not only change the message contents, but also manipulate (add, extract and remove) attachments from a message object. You can customize message headers by adding or removing recipients, changing the subject or other properties. It also gives you complete control over an email message by providing access to its Mapi properties.

C# Outlook MSG file reader without the need for Outlook

MSGReader is a C# .NET 4.0 library to read Outlook MSG and EML (Mime 1.0) files. Almost all common object in Outlook are supported.

于 2015-04-09T13:23:59.000 回答
2

尝试:

  • febootimail
  • SMTP快递
  • LinkWS Newsletter Turbo
  • emlBridge - 将 eml 文件导入 Outlook 和几乎任何其他电子邮件客户端
  • 时事通讯 2.1 涡轮增压
  • ThunderStor (emlResender)
  • 红宝石(使用eml2mbox)。参见jimbob 方法
  • Evolution - 创建新消息,附加 eml 文件,

编写一个程序:

解决方法:

  • $ 猫邮件.eml | mail -s -c 但是标题不会被解析,附件也不会。
  • 将它们放入您的 GMail(Firefox 会将它们保存为附件)
于 2010-12-13T13:20:13.177 回答