在 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中包含的附件吗?【参考方案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
http://www.aspose.com/.net/email-component.aspx https://www.nuget.org/packages/Aspose.Email/ 有一个具有以下限制的评估版本: http://www.aspose.com/docs/display/emailnet/LicensingAspose.Email for .NET 是一个组件的集合,用于处理 .NET 应用程序中的电子邮件。它使工作变得容易 具有多种电子邮件消息格式和消息存储文件 (PST/OST) 以及消息发送和接收功能。
Aspose.Email 可以轻松创建、阅读和操作大量 消息格式,例如 MSG、EML、EMLX 和 MHT 文件无需 安装 Microsoft Outlook。您不仅可以更改消息 内容,还可以操作(添加、提取和删除)附件 来自消息对象。您可以通过添加或 删除收件人、更改主题或其他属性。它也是 通过提供访问权限,您可以完全控制电子邮件 到它的 Mapi 属性。
无需 Outlook 的 C# Outlook MSG 文件阅读器
https://www.nuget.org/packages/MSGReader/ https://github.com/Sicos1977/MSGReaderMSGReader 是一个 C# .NET 4.0 库,用于读取 Outlook MSG 和 EML(Mime 1.0) 文件。支持 Outlook 中几乎所有常见的对象。
【讨论】:
以上是关于在 C# 中解析 .eml 文件的建议的主要内容,如果未能解决你的问题,请参考以下文章
如何解析带有附件和内联图像的 EML 文件并转换为 HTML