我有一个包含电子邮件对话的.eml文件目录。在C#中,解析这种类型的文件有推荐的方法吗?
2017年8月更新:看看MimeKit:https://github.com/jstedfast/MimeKit。它支持.NET Standard,因此可以跨平台运行。
原回答:我在Github上发布了一个示例项目来说明这个答案 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;
}
该文章总结了4个步骤(以下第二步在文章中被省略,但是需要执行):
在Visual Studio的“添加引用”对话框的“COM”选项卡中找到“Microsoft CDO for Windows 2000 Library”,并将其添加为项目的引用。这将向您的项目中添加2个引用:“ADODB”和“CDO”。
禁用“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。
http://www.codeproject.com/Articles/11882/Advanced-MIME-Parser-Creator-Editor http://www.lumisoft.ee/lswww/download/downloads/Net/info.txt
获得一个好的 MIME 解析器可能是可行的方法。您可以尝试使用免费的 MIME 解析器(例如 此处 的代码)但是来自代码作者的评论让我对代码质量产生了好奇。
我同时在开发 MSG 文件的包装类时开始了这个项目。难度有很大的区别。EML 包装类可能花了一天时间阅读规范并实现,而 MSG 包装类则花费了一周。
我确信您可以黑掉一个解析 95% 邮件正确的 MIME 解析器,仅需几天/几小时。但我也确信,在正确处理剩余 5% 的情况下会花费数月时间,其中包括处理 S/MIME(加密和签名电子邮件)、Unicode、由不良邮件客户端和服务器生成的畸形电子邮件、多种编码模式、国际化问题以及确保故意畸形的电子邮件不会使您的应用程序崩溃等。
如果您要解析的电子邮件来自单一来源,则快速且简单的解析器可能足够。如果需要解析来自未知来源的电子邮件,则需要更好的解决方案。
我建议使用我们的Rebex Secure Mail组件,但我相信其他供应商的组件也能得到不错的结果。using Rebex.Mail;
MailMessage message = new MailMessage();
message.Load("file.eml");
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使得不需要安装Microsoft Outlook就可以轻松创建、读取和操作多个消息格式,例如MSG、EML、EMLX和MHT文件。您不仅可以更改消息内容,还可以从消息对象中操作(添加、提取和删除)附件。您可以通过添加或删除收件人、更改主题或其他属性来自定义消息头。它还通过提供对其Mapi属性的访问,为您完全控制电子邮件消息。
无需Outlook即可读取C# Outlook MSG文件
MSGReader是一个C# .NET 4.0库,用于读取Outlook MSG和EML(Mime 1.0)文件。几乎支持Outlook中的所有常见对象。