在C#中parsing.eml文件的build议

我有一个包含电子邮件对话的.eml文件的目录。 C#parsing这种types的文件是否有推荐的方法?

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

CDO COM DLL是Windows / IIS的一部分,可以在.net中引用。 它将提供准确的parsing和一个不错的对象模型。 将其与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; } 

– 2017年8月join:也检查出MimeKit: https : //github.com/jstedfast/MimeKit 。 它支持.Net标准,所以会运行跨平台。

LumiSoft包含一个Mimeparsing器 。

莎莎还包括一个Mime语法分析器。

按照此链接获得一个好的解决scheme:

文章的总结是4个步骤(下面的第二步是在文章中缺less,但需要):

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

  2. 禁止为2参考“ADODB”和“CDO”embeddedInteroptypes。 (参考 – > ADODB – >属性 – >设置'embedded互操作types'为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文件的完整path来调用这个方法,它返回的CDO.Message对象将包含所有需要的parsing信息,包括To,From,Subject,Body。

获得体面的MIMEparsing器可能是一种方法。 您可以尝试使用免费的MIMEparsing器(例如codeproject中的这个parsing器),但是可以使用像这样的代码作者的注释

我在大约与我一起处理MSG文件的包装类的同时工作。 难度差异很大。 如果EML包装类可能花了一天的时间阅读规范并得到正确的 ,MSG包装类花了一个星期。

让我对代码质量感到好奇。 我敢肯定,你可以破解一个MIMEparsing器,在几天/几小时内正确parsing95%的电子邮件。 我也很确定,剩下的5%需要几个月的时间。 考虑处理S / MIME(encryption和签名的电子邮件),unicode,错误的邮件客户端和服务器产生格式不正确的电子邮件,几个编码模式,国际化问题,确保有意识的商业forms的电子邮件不会崩溃你的应用程序,等等…

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

我会推荐我们的Rebex安全邮件组件 ,但是我相信你也可以从其他厂商那里得到相当好的结果。

确保您所select的parsing器在由Mike Crispin(MIME和IMAP RFC的合着者)编写的臭名昭着的“Mime酷刑示例消息”上正确工作。 testing消息显示在MIME Explorer示例中 ,可以在安装包中下载 。

以下代码显示了如何读取和parsingEML文件:

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

你可能需要的是一个电子邮件/ MIME分析器。 parsing所有的头部字段并不是很难,但是分离出各种MIMEtypes,比如图片,附件,各种文本和html部分等,都会变得非常复杂。

我们使用第三方工具,但有许多C#工具/库在那里。 在Google中search免费的C#电子邮件MIME分析器。 就像我得到这个:

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

我刚开始使用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派生的。)

尝试:

  • febootimail
  • SmtpExpress
  • LinkWS通讯Turbo
  • emlBridge – 将eml文件导入到Outlook和几乎任何其他电子邮件客户端
  • 通讯2.1 Turbo
  • ThunderStor (emlResender)
  • Ruby(使用eml2mbox )。 见jimbob方法 。
  • 进化 – 创build新消息,附加eml文件,

编写一个程序:

  • 在C#中(见[this] [4]和this )。 请参阅: 源代码 。
  • 使用反叛安全邮件库
  • .NET(看到这个 , 这个 )

解决方法:

  • $ cat mail.eml | mail -s -c但标题不会被parsing,也不会附件。
  • 把它们放到你的GMail中(Firefox会把它们保存为附件)

用于.NET的Aspose.Email

Aspose.Email for .NET是用于处理.NET应用程序中的电子邮件的组件集合。 它可以轻松处理一些电子邮件格式和邮件存储文件(PST / OST)以及邮件发送和接收function。

Aspose.Email使创build,阅读和操作诸如MSG, EML ,EMLX和MHT等多种消息格式变得容易, 而无需安装Microsoft Outlook 。 您不仅可以更改消息内容,还可以操作(添加,提取和移除)来自消息对象的附件。 您可以通过添加或删除收件人,更改主题或其他属性来自定义邮件标题。 它还通过提供对其Mapi属性的访问,让您完全控制电子邮件。

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

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