2011-10-08 47 views
4

我有一個Web應用程序,在執行特定操作後,應從中發送電子郵件。我有一些替代方案來處理這個問題,我不確定哪一個是最好的。使用C#/。NET發送電子郵件策略

第一個是,當用戶執行操作時,電子郵件直接從ASP.NET應用程序發送。但我認爲這不是一個真正可靠的系統,因爲如果SMTP服務器關閉或發生其他事情,用戶只會得到一個反饋,表明他的行爲無法完成。

作爲替代,我想實現一個排隊系統是我有一些想法:

  • 推送電子郵件發送,到數據庫表,和業務應用會定期檢查新郵件,然後發送他們。成功發送時,它表示電子郵件任務已完成。
  • 使用MSMQ進行排隊。在這種情況下,整個電子郵件可以作爲消息傳遞;或者另一種方法是將帶有附件的消息存儲到數據庫表中,並僅傳遞查詢數據庫表併發送消息所需的數據。在這種情況下,我不必處理MSMQ的大小限制(由於附件)。
  • 別的東西,像本地WCF服務,通知服務

哪種方式,你認爲是最好的?

+1

這完全取決於您的業務需求。如果相應的電子郵件可能由於例如某些原因而延遲了幾天,那麼可以採取行動以「成功」。 SMTP正在關閉?如果是這樣,數據庫隊列看起來像一個簡單而好的解決方案。 – Jon

+0

嗯,不是幾天,但如果有例如5分鐘出來它仍然不是真正用戶友好的通知他們以後再試一次消息,我想避免。第一個解決方案看起來很容易實現,但我必須爲檢查指定輪詢間隔,然後執行批處理作業。在其他情況下,服務會立即收到通知,並可以處理髮送。然而,我不是這個話題的專家,這就是爲什麼我想在我描述的解決方案中得到一些一般性的反饋。 – norbip

回答

5

使用MSMQ不是很好的解決方案,因爲每個大小的限制爲4 MB。 http://blogs.msdn.com/b/johnbreakwell/archive/2007/08/22/why-is-there-a-4mb-limit-on-msmq-messages.aspx 更糟糕的情況下,如果MSMQ失敗,像它處理拋出錯誤或突然關機,它會丟失許多消息。在我的情況下,當硬件和軟件安裝在幾乎理想的情況下,這個解決方案是好的

使用數據庫和窗口服務更好,因爲它很簡單,不需要太多的努力。

我通常使用數據庫和文件的組合。該數據庫包含表格以保存標題信息和標記,該標記表明消息已成爲操作(成功或錯誤或其他),並且文件包含原始格式的消息(html或plain)和附件。 當進程運行發送時,從文件組裝消息比查詢blob/clob更快。 由於他們在應用程序上使用文件系統,因此您可以添加硬件(如服務器或組件),或者輕鬆添加系統的可用性。 也可以添加數據庫,但它會讓您在數據庫軟件中獲得更多許可證。 我在x次發送電子郵件後添加一個測試發送電子郵件,以確保它運行正常;此測試電子郵件會發送到我自己的虛擬收件箱或應用程序中,以檢查發送和接收的電子郵件是否相同。如果相同,則發送未處理的電子郵件將會再次繼續

另一種方法,如果您使用MS Exchange,則可以使用消息隊列通過利用其Web服務來排隊發送消息。這是一種簡單的方法,但您需要許可證。 您可以在MSDN庫上看到如何利用MS Exchange Web服務。

+0

「更糟的情況是,如果MSMQ失敗,就像它處理拋出錯誤或突然關閉一樣,它將丟失許多消息。」那是不對的。 Onloy express信息在碰撞/斷電時丟失,因此請使用可靠的信息。 –

-1

您可以使用像hmail這樣的電子郵件服務器。爲了將電子郵件推送到隊列中,您可以將它們推送到郵件服務器。爲此,您可以編寫一個Windows窗體應用程序,該應用程序具有一個計時器對象,用於檢查電子郵件表中具有狀態0(未發送)的每一行。當線程發送給郵件服務器時,它將被標記爲1(發送)。

如果您使用數據庫,還可以對電子郵件進行分類。不同的操作可以發送不同的電子郵件您也可以將此信息存儲在數據庫中,以便窗口應用程序線程現在可以發送哪個電子郵件模板。

+0

我想實現是電子郵件服務器不可知的。只有POP3/SMTP地址和憑證纔會被識別。 – norbip