我正在使用here中提到的過程創建eml並將它們保存到目錄中。 我想知道如何發送這些eml文件? 我嘗試使用SMTPClient類的對象,但它將MailMessage對象作爲其參數,我無法找到並使用這些保存的eml文件創建一個MailMessage類型的對象。發送保存在磁盤上的eml文件
回答
使用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);
正確加載EML文件並不像看起來那麼容易。您可以在幾天內編寫一個在95%情況下工作的實現。剩下5%至少需要幾個月;-)。我知道,因爲我參與了開發一個。
考慮以下dificulities:
- unicode的電子郵件
- 從右到左的語言
- 糾正流行的郵件客戶端造成衆所周知的錯誤畸形EML文件和服務器
- 處理S/MIME(加密和簽名的電子郵件)
- 正確處理幾種附件編碼方法
- 處理內嵌圖片和樣式表嵌入到HTML電子郵件
- 確保它解析正確地從邁克·克里斯平(MIME和IMAP的RFC的合着者)一個MIME torture message
- 確保不良消息不會導致緩衝區OVERUN或其他應用程序崩潰
- 處理分層消息(消息附帶消息)
- 確保其正確處理非常大的郵件
成熟等解析器需要數年時間和連續的反饋爲它的用戶。現在,.NET框架中沒有包含這樣的解析器。直到它發生變化,我會申請從已建立的供應商處獲得第三方MIME解析器。
以下代碼使用我們的Rebex Secure Mail component,但我確定可以使用其他供應商的組件輕鬆地複製類似的任務。
該代碼基於Mail Message tutorial。
// 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");
嗨馬丁你曾經試過這段代碼message.Load()。沒有這樣的方法。請嘗試您的代碼,然後發佈。 – 2011-03-10 05:59:03
@Vikrant代碼工作得很好。它使用自1.0版以來具有Load方法的Rebex.Mail.MailMessage類。它在代碼上方的帖子中提到。也許你的意思是System.Net.Mail.MailMessage沒有Load方法?我知道 - 這就是我的答案使用不同課程的確切原因。 – 2011-03-11 01:08:56
做我做了什麼......放棄。
構建對象MAILMESSAGE似乎成爲焦點,我有一個突出的問題同樣放在這裏太... How do i send an email when i already have it as a string?
從我看到這樣做最簡單的方法是使用原始套接字將整個.eml文件內容直接轉儲到郵件服務器,並讓郵件服務器通過使用它的引擎解析電子郵件,從中找出諸如此類的難題,等等。
唯一的問題...RFC 821 ...這樣的痛苦,我試圖找出一個乾淨的方式來做到這一點,並快速閱讀已經在郵箱中的郵件。
編輯:
我發現了一個乾淨的解決方案,並覆蓋在我的線程:)
對於記錄:
在的NuGet打包程序控制臺寫:
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);
}
如果你是一個微軟的商店,並有一個Exchange服務器,無論如何,那麼還有另一種解決方案是多少,比這裏的一切其他建議要容易得多:
每個Exchange服務器都有一個拾取目錄配置了的盒子。
默認情況下,它是%ExchangeInstallPath%TransportRoles\Pickup
。
您只需將.eml
文件複製到該目錄,Exchange就會自動發送郵件。
閱讀此TechNet文章以瞭解更多信息:
Pickup directory and Replay directory
正如其他人證明,EML只是不serialize
郵件消息的好方法。保存郵件的格式可能會更好。儘管.Net框架中有幾個序列化引擎可以序列化任何對象,但您也可以考慮將您的郵件組件(如地址,主體,要附加到base64中的文件)保存在自己設計的Xml文件中。
下面是一個例子,讓你開始:
<?xml version="1.0" encoding="utf-8"?>
<mail>
<to display="Thomas Edison" address="[email protected]" />
<body>
Hi Thomas,
How are you doing?
Bye
</body>
<attachment name="MaryLamb.wav">
cmF0aWUgYWFuIGluIFBERi1mb3JtYWF0LiBEZSBmYWN0dXVyIGlzIGVlbiBvZmZpY2ll
ZWwgZ2VzaWduZWVyZA0KZG9jdW1lbnQgdmFuIEV1cm9maW5zIE9tZWdhbSBCVi4gRGUg
c2lnbmF0dXJlIGt1bnQgdSB2ZXJpZmnDq3Jlbi4NCg0KVm9vciBoZXQgdmVyaWZpw6ty
...
</attachment>
</mail>
額外的好處是,不像創造EML,你不需要smtpClient打造的概念郵件文件。
Xml非常容易在C#中創建和解析。
您沒有告訴保存EML的理由。如果長期存檔將是一個目標,xml可能會有優勢。
- 1. 在磁盤上保存文件
- 2. Carrierwave不保存磁盤上的文件
- 3. 將文件保存在磁盤中
- 4. 如何將MailMessage對象作爲* .eml或* .msg文件保存到磁盤
- 5. 將上傳的文件保存在磁盤上,ubuntu路徑
- 6. HTML5文件系統 - 保存磁盤上的文件
- 7. 保存附件文件在磁盤上得到失敗
- 8. 在磁盤或MongoDB上存儲文件
- 9. 回形針,在保存在磁盤上的文件之前保存記錄
- 10. UWP將zip文件保存到磁盤
- 11. 下載並保存文件到磁盤
- 12. Couchbase - 將文檔保存在內存和磁盤上的順序
- 13. 保存並讀取磁盤上的文件
- 14. Tomcat AccessLogValve永久保存磁盤上的所有文件?
- 15. 在磁盤上寫上傳的文件
- 16. Chrome擴展程序:如何將文件保存到磁盤上
- 17. HTML5文件上傳,不保存到磁盤
- 18. 列表保存到磁盤上
- 19. 在內存中創建FileStream而不是在磁盤上保存物理文件
- 20. APK文件磁盤上不
- 21. 將DynamicMethod保存到磁盤
- 22. Mongoengine FileField保存到磁盤?
- 23. 將NSMutableArray保存到磁盤
- 24. 將trie保存到磁盤
- 25. 將nsdate保存到磁盤
- 26. 在低磁盤或RAM上發送電子郵件提醒
- 27. Django的媒體文件在磁盤上
- 28. 將Outlook附件保存到磁盤
- 29. Java保存資源文件夾到磁盤文件夾
- 30. 保存與列表列的磁盤到磁盤
提供的代碼不處理替代視圖或附件。鏈接的文章指出它已經過時並鏈接到另一個(http://www.codeproject.com/KB/office/EML_ReaderEx.aspx),它可以更好地處理備用視圖和附件,但仍有一些問題(BCC看起來像恢復不當作爲「收件人」) – iammichael 2011-02-21 22:41:38
是的,我知道。只是試圖幫助其他任何人(如我自己)在嘗試找到同樣問題的解決方案時遇到此問題。另請參閱相關的問題:http://stackoverflow.com/questions/936422/recommendations-on-parsing-eml-files-in-c – iammichael 2011-02-22 21:28:51