2009-08-20 95 views
8

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

回答

6

使用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); 
+2

提供的代碼不處理替代視圖或附件。鏈接的文章指出它已經過時並鏈接到另一個(http://www.codeproject.com/KB/office/EML_ReaderEx.aspx),它可以更好地處理備用視圖和附件,但仍有一些問題(BCC看起來像恢復不當作爲「收件人」) – iammichael 2011-02-21 22:41:38

+2

是的,我知道。只是試圖幫助其他任何人(如我自己)在嘗試找到同樣問題的解決方案時遇到此問題。另請參閱相關的問題:http://stackoverflow.com/questions/936422/recommendations-on-parsing-eml-files-in-c – iammichael 2011-02-22 21:28:51

7

正確加載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"); 
+1

嗨馬丁你曾經試過這段代碼message.Load()。沒有這樣的方法。請嘗試您的代碼,然後發佈。 – 2011-03-10 05:59:03

+1

@Vikrant代碼工作得很好。它使用自1.0版以來具有Load方法的Rebex.Mail.MailMessage類。它在代碼上方的帖子中提到。也許你的意思是System.Net.Mail.MailMessage沒有Load方法?我知道 - 這就是我的答案使用不同課程的確切原因。 – 2011-03-11 01:08:56

1

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

構建對象MAILMESSAGE似乎成爲焦點,我有一個突出的問題同樣放在這裏太... How do i send an email when i already have it as a string?

從我看到這樣做最簡單的方法是使用原始套接字將整個.eml文件內容直接轉儲到郵件服務器,並讓郵件服務器通過使用它的引擎解析電子郵件,從中找出諸如此類的難題,等等。

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

編輯:

我發現了一個乾淨的解決方案,並覆蓋在我的線程:)

How do i send an email when i already have it as a string?

0

對於記錄:

在的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); 
} 
1

如果你是一個微軟的商店,並有一個Exchange服務器,無論如何,那麼還有另一種解決方案是多少,比這裏的一切其他建議要容易得多:

每個Exchange服務器都有一個拾取目錄配置了的盒子。
默認情況下,它是%ExchangeInstallPath%TransportRoles\Pickup

您只需將.eml文件複製到該目錄,Exchange就會自動發送郵件。


閱讀此TechNet文章以瞭解更多信息:
Pickup directory and Replay directory

0

正如其他人證明,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可能會有優勢。