簡體   English   中英

在 C# 中解析 .eml 文件的建議

[英]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個步驟(下面的第二步文章中缺少但需要):

  1. 添加對“Microsoft CDO for Windows 2000 庫”的引用,該引用可在 Visual Studio 的“添加引用”對話框的“COM”選項卡上找到。 這將在您的項目中添加 2 個對“ADODB”和“CDO”的引用。

  2. 禁用嵌入 2 個參考“ADODB”和“CDO”的互操作類型。 (參考 -> ADODB -> 屬性 -> 將“嵌入互操作類型”設置為 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 文件的完整路徑來調用此方法,它返回的 CDO.Message 對象將包含您需要的所有解析信息,包括 To、From、Subject、Body。

LumiSoft包括一個Mime 解析器

Sasa還包括一個 Mime 解析器。

獲得一個像樣的 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 中的所有常見對象。

嘗試:

  • feboot郵件
  • SMTP快遞
  • LinkWS 時事通訊 Turbo
  • emlBridge - 將 eml 文件導入 Outlook 和幾乎任何其他電子郵件客戶端
  • 時事通訊 2.1 Turbo
  • ThunderStor (emlResender)
  • Ruby(使用eml2mbox )。 jimbob方法
  • Evolution - 創建新消息,附加 eml 文件,

編寫程序:

解決方法:

  • $ cat mail.eml | mail -s -c 但是不會解析標題,也不會解析附件。
  • 將它們放入您的 GMail(Firefox 會將它們保存為附件)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM