2011-10-03 77 views
0

可能重複:
How to save MailMessage object to disk as *.eml or *.msg file保存自動生成的電子郵件?

我對電子郵件的人當某些條件得到滿足C#程序的工作。我希望能夠保存電子郵件的副本以便保存記錄,並且無法弄清楚。我覺得它令人驚訝的是它沒有像message.Save()這樣的功能。

我已經包含下面一個非常基本的電子郵件示例:

MailMessage message = new MailMessage("from_email", "to_email"); 
message.Subject = "Email Alert"; 
message.Body = "This is a test email."; 
SmtpClient Smtp = new SmtpClient("smtp server"); 
Smtp.Send(message); 

我想保存的電子郵件的副本記錄。我沒有真正考慮存儲郵件的所有方式,對此抱歉。如果收件人沒有收到電子郵件,我可以將其副本從存檔中轉發給他們。我認爲.msg會很好。

另外,我希望能夠保存電子郵件,然後在一天結束時發送批處理。如果我收到需要添加的更新,我可能必須編程向電子郵件中添加新條目,以便收件人不會因多封電子郵件而過載。但是,在某些情況下,遇到升級時,無論何時都會自動發送電子郵件。

+3

保存對你有什麼意義?數據庫?純文本文件? XML?雲? – RedFilter

+0

如果您已經批處理/保存到數據庫,那麼您的問題是什麼?你已經**了'保存電子郵件的副本'。 –

+0

@ p.cambell:我想爲非程序員備份而無需訪問數據庫,並且如果需要的話可以很容易地重新發送文件。 – buzzzzjay

回答

3

幾個不同的方式來「備份」你的電子郵件信息,使他們能夠在必要時被重新發送:

  • procmail的。根據您使用的MTA,在您的MTA發送郵件時編寫ProcMail recipe來存檔郵件將非常容易。如果您使用的是Exchange,則可以在服務器端完成相同的操作。

  • XML序列化。創建MailMessage類的每個實例後,將其序列化並將其存儲在文件系統或數據庫中。在需要時應該足夠簡單以重新水化實例。

  • 拾取目錄。SmtpClient類可以配置爲將消息「發送」到「拾取目錄」。這通常用於MTA(郵件傳輸代理)配置爲監視特定目錄的配置中。發送郵件的過程包括將包含RFC 2822-compliant message的文件放入目錄中,在該目錄中很快會被MTA收集併發送。如果沒有將MTA配置爲觀看代答目錄,則郵件信息將被丟棄並放置。

    這是一個測試應用程序的有用方法,它可以在不涉及真正的MTA的情況下進行郵件發送。當人們遭到垃圾信息抨擊時,他們往往會變得脾氣暴躁。

    這也是一種有用的歸檔技巧:在程序中配置2個SmtpClient實例:一個配置爲與您的MTA交談,另一個配置爲將郵件放入拾取目錄中。將您創建的每個MailMessage發佈到兩個實例,然後您將擁有您的存檔。

任何一種這些技術都應該適合你。如果您確實需要重新發送電子郵件,則XML序列化可能是您的最佳選擇,因爲通過XML序列化來重新水化對象實例非常簡單。

+0

您是否知道是否有任何方法更改輸出.eml文件的文件名?我寧願它看起來不像以下內容:f80f4695-551c-47d7-8879-40ad89707b23.eml謝謝! – buzzzzjay

+0

我對此表示懷疑。如果你用Reflector在'SmtpClient'的內部挖掘了一下,我懷疑你會發現它在臨時目錄中創建文件,然後在它被寫入並關閉之後將它移動到拾取目錄。 –

5

爲什麼不將密碼抄送到管理員帳戶?

3

這裏要問的重要問題是:將它保存到哪裏?

這就是爲什麼沒有內置Save()方法。電子郵件通常不是簡單地保存到文件系統的東西(這並不是說他們不能)。但是有很多信息不是簡單地存儲的,例如收件人/發件人地址,主題行,不同部分(即MIME替代部分,附件)。

4

好了,你沒有太具體的什麼你要找的人,所以這裏有幾個選項:

  1. BCC自己。這將(私下)向你自己發送一份電子郵件。
  2. 如果要保存到文件,請自行實施保存。這並不難。真的,你想要做的只是保存一些文本。我們可以實現這樣的:

    private void SaveEmailToDisk(MailMessage message, string saveTo) 
    { 
        var builder = new StringBuilder(); 
        builder.AppendFormat("To: {0}\n", String.Join("; ", message.To.Select(m => m.Address).ToArray())); 
        builder.AppendFormat("From: {0}\n",message.From.Address); 
        builder.AppendFormat("Subject: {0}", message.Subject); 
        builder.AppendFormat("Body: {0}", message.Body); 
        File.WriteAllText(saveTo, builder.ToString()); 
    } 
    

當然,您可以在調整到任何需要你。

1

爲什麼不在發送電子郵件之前將數據寫入數據庫表?然後,您將記錄發送了哪封電子郵件。

+0

我計劃將數據存儲在數據庫中,然後再通過電子郵件發送。我想要備份,以便我可以在需要時重新發送。 – buzzzzjay

+1

我已經設置了一個最近的web應用程序來做到這一點,所以用戶可以檢查自動系統電子郵件是否按照他們的預期發佈。它工作得很好。如果您在電子郵件周圍捕獲異常,則可以在數據庫中設置一個標誌,以便在沒有異常情況下更新。然後,如果設置了標誌,則需要經常重新發送電子郵件。 – Dragn1821