[英]Recommendations on parsing .eml files in C#
我有一个包含电子邮件对话的 .eml 文件目录。 在 C# 中是否有推荐的方法来解析这种类型的文件?
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;
}
文章总结为4个步骤(下面的第二步文章中缺少但需要):
添加对“Microsoft CDO for Windows 2000 库”的引用,该引用可在 Visual Studio 的“添加引用”对话框的“COM”选项卡上找到。 这将在您的项目中添加 2 个对“ADODB”和“CDO”的引用。
禁用嵌入 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。
获得一个像样的 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 sample 中,可以在安装包中下载。
以下代码显示了如何读取和解析 EML 文件:
using Rebex.Mail;
MailMessage message = new MailMessage();
message.Load("file.eml");
您可能需要的是电子邮件/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
为此,我刚刚开始使用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
派生的。)
Aspose.Email for .NET
Aspose.Email for .NET 是一组用于在 .NET 应用程序中处理电子邮件的组件。 它可以轻松处理多种电子邮件消息格式和消息存储文件 (PST/OST) 以及消息发送和接收功能。
Aspose.Email 可以轻松创建、阅读和操作多种消息格式,例如 MSG、 EML 、EMLX 和 MHT 文件,而无需安装 Microsoft Outlook 。 您不仅可以更改消息内容,还可以操作(添加、提取和删除)消息对象中的附件。 您可以通过添加或删除收件人、更改主题或其他属性来自定义邮件标题。 它还通过提供对其 Mapi 属性的访问权限,使您可以完全控制电子邮件。
C# Outlook MSG 文件阅读器,无需 Outlook
MSGReader 是一个 C# .NET 4.0 库,用于读取 Outlook MSG 和 EML (Mime 1.0) 文件。 几乎支持 Outlook 中的所有常见对象。
尝试:
编写程序:
解决方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.