簡體   English   中英

發送保存在磁盤上的eml文件

[英]Send eml files saved on disk

我正在創建eml並使用此處提到的過程將它們保存到目錄中。 我想知道如何發送這些eml文件? 我嘗試使用SMTPClient類的對象,但它將MailMessage對象作為其參數,我無法找到並使用這些保存的eml文件創建MailMessage類型的對象。

正確加載EML文件並不像看起來那么容易。 您可以在幾天內編寫一個在95%的情況下工作的實現。 剩下的5%至少需要幾個月;-)。 我知道,因為我參與了一個開發。

考慮以下困難:

  • unicode電子郵件
  • 從右到左的語言
  • 糾正由流行的郵件客戶端和服務器中眾所周知的錯誤導致的格式錯誤的EML文件
  • 處理S / MIME(加密和簽名的電子郵件)
  • 正確處理幾種編碼附件的方法
  • 處理嵌入到HTML電子郵件中的內嵌圖像和樣式表
  • 確保它正確解析來自Mike Crispin(Mime和IMAP RFC的合着者)的MIME酷刑消息
  • 確保格式錯誤的消息不會導致緩沖區溢出或其他應用程序崩潰
  • 處理分層消息(帶附加消息的消息)
  • 確保它正確處理非常大的電子郵件

這種解析器的成熟需要數年時間並且不斷為用戶提供反饋。 現在,.NET Framework中沒有包含此類解析器。 在它改變之前,我會從已建立的供應商處獲取第三方MIME解析器。

以下代碼使用我們的Rebex安全郵件組件 ,但我確信類似的任務也可以使用其他供應商的組件輕松復制。

該代碼基於郵件消息教程

// create an instance of MailMessage 
MailMessage message = new MailMessage();

// load the message from a local disk file 
message.Load("c:\\message.eml");

// send message
Smtp.Send(message, "smtp.example.org");

使用EMLReader從.eml文件中檢索數據。 它包含創建MailMessage對象所需的所有數據,如From,To,Subject,Body等等。

FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite);
EMLReader reader = new EMLReader(fs);
fs.Close();

MailMessage message = new System.Net.Mail.MailMessage(reader.From, reader.To, reader.Subject, reader.Body);

如果你是一個微軟商店並且還有一台Exchange服務器,那么還有另一種解決方案比這里建議的其他方法容易得多:

每個Exchange服務器都有一個開箱即用的拾取目錄。
默認情況下,它是%ExchangeInstallPath%TransportRoles\\Pickup

您只需將.eml文件復制到該目錄,Exchange將自動發送郵件。


閱讀此TechNet文章以獲取更多信息:
分揀目錄和重播目錄

做我做了什么......放棄。

構建MailMessage對象似乎是我在這里也有類似問題的焦點... 當我已經將它作為字符串時,我如何發送電子郵件?

從我所看到的最簡單的方法是使用原始套接字將整個.eml文件內容轉儲到郵件服務器,然后讓郵件服務器找出諸如from,to subject等內容。通過使用它的引擎解析電子郵件。

唯一的問題...... RFC 821 ......這樣的痛苦,我正試圖想出一個干凈的方法來做到這一點並快速閱讀已經在郵箱中的郵件。

編輯:

我找到了一個干凈的解決方案並在我的線程中覆蓋它:)

當我已經將它作為字符串時,我如何發送電子郵件?

對於記錄:

在Nuget Packager Console中寫道:

Install-Package LumiSoft.Net.dll

然后在你的代碼中:

using (FileStream fs = new FileStream( cacheFileName, FileMode.Open, FileAccess.Read )) 
using (LumiSoft.Net.SMTP.Client.SMTP_Client client = 
   new LumiSoft.Net.SMTP.Client.SMTP_Client())
{
    client.SendMessage( fs );
}

正如其他人所說,EML不是serialize郵件消息的好方法。 通過以其他格式保存郵件可能會更好。 雖然.Net框架中有幾個序列化引擎可以序列化任何對象,但您也可以考慮將您的郵件組件(如地址,正文,要附加到base64中的文件)保存在您自己設計的Xml文件中。

以下是一個讓您入門的示例:

    <?xml version="1.0" encoding="utf-8"?>
    <mail>
      <to display="Thomas Edison" address="tedison@domain.com" />
      <body>
        Hi Thomas,
        How are you doing?
        Bye
      </body>
      <attachment name="MaryLamb.wav">
        cmF0aWUgYWFuIGluIFBERi1mb3JtYWF0LiBEZSBmYWN0dXVyIGlzIGVlbiBvZmZpY2ll
        ZWwgZ2VzaWduZWVyZA0KZG9jdW1lbnQgdmFuIEV1cm9maW5zIE9tZWdhbSBCVi4gRGUg
        c2lnbmF0dXJlIGt1bnQgdSB2ZXJpZmnDq3Jlbi4NCg0KVm9vciBoZXQgdmVyaWZpw6ty
        ...
      </attachment>
    </mail>

增加的優勢在於,與創建EML不同,您不需要smtpClient來構建概念郵件文件。

Xml非常容易在C#中創建和解析。

你沒有說出保存EML的理由。 如果長期歸檔是一個目標,那么xml可能具有優勢。

您可以使用Windows Server的內置SMTP服務器執行此操作,方法與上一個使用Exchange的答案相同。

將.eml文件刪除到C:\\inetpub\\mailroot\\Pickup ,將發送原始郵件(本地或遠程)。

您只需在頂部插入一行即可轉發郵件:

To: email@address.com

如果需要,您可以進一步操作郵件頭。

暫無
暫無

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

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