[英]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.