2011-07-26 48 views
2

我在企業環境中有很多應用程序,他們都使用不同的發送電子郵件的方法。一些直接通過交換服務器發送,一些在SMTP隊列中本地排隊,另一些則通過Web服務發送電子郵件。在許多應用程序中處理電子郵件分發的最佳方式是什麼?

我想確定最好的方式來保證郵件的傳遞。如果我們的Exchange服務器出現故障,那麼直接發送給它的應用程序將不能再發送電子郵件,在停機期間發送的任何電子郵件也不會到達任何地方。我也想實現一個通用模板解決方案,所有應用程序都可以共享。

這個問題是否有預先構建的解決方案,或者您有關於如何處理此問題的見解?

回答

2

我們通過創建一個發送我們所有電子郵件的Web服務來解決這個問題。此Web服務使用

System.Net.Mail.SmtpDeliveryMethod.PickupDirectoryFromIis 

設置,基本上將文件保存到磁盤上的一個點,試圖通過主SMTP服務器發送他們,如果服務器不可用,他們坐的目錄中,直到它BECOMES可用。

保證交付,只要網絡服務啓動。由於我們有冗餘檢查,這幾乎從來都不是問題。如果是這樣,我們將它視爲代碼中的錯誤並處理它。

編輯 - 添加

我忘了提,XSS甚至在一封電子郵件中關注的問題,所以一定要使用類似Microsoft.Security.AntiXss庫,其中包含像GetSafeHtmlFragment職能剝離出來在輸出HTML到電子郵件之前有潛在危險的腳本。

http://msdn.microsoft.com/en-us/security/aa973814.aspx

http://msdn.microsoft.com/en-us/library/aa973813.aspx

+0

這是否工作以及複雜的電子郵件(HTML,多個附件,等等)? – scottm

+0

此時不帶附件。它還沒有出現。我們沒有必要弄清楚如何獲得附件來完成網絡服務。除了我的頭頂之外,我不確定這是如何工作的,除非您在附錄必須保存到網絡上的特定文件夾的地方採取了一些解決方法,然後將路徑提供給Web服務。這聽起來像是一個有趣的挑戰。我現在要看看自己是否已經提出了自己的想法,但可能沒有及時將其用作此問題的答案。 – David

+0

它適用於HTML電子郵件就好了。 – David

2

我聽說有郵戳的良好反饋。也許像這樣的服務可能是解決方案,因爲它有幾個集成點。

http://postmarkapp.com

0

我們已經使用HMailServer(在Windows平臺上),這是免費的。配置最多的重試次數太多&使用外部smtp中繼電子郵件。我們的應用程序在HMailServer上查詢電子郵件,並且該服務器進一步中繼它。如果在所有主要smtp服務器關閉的情況下配置最大重試次數很多,我們可以確保發送電子郵件 - 但是,如果主smtp中繼服務器存在巨大停機時間,則沒有保證。

0

我通過將電子郵件排隊到SQL服務器數據庫來做到這一點。任何符合ACID標準的數據庫都可以工作,或者您可以使用MongoDB和'安全模式'插入,但如果您確實需要保證,那麼使用SQL Server或MySQL。這樣,如果你的郵件進入數據庫,它'保證'不會丟失,你的應用程序不必考慮它。您可以使用Web服務,或者在類中使用靜態公共方法創建共享程序集,以便將電子郵件放入數據庫中供您使用。

包括狀態欄,如'新','已發送','收件人郵箱暫時已滿',您可以使用數字值表示並保留一個TimeToSend列,該列開始時間爲電子郵件排隊時間數據庫。

然後你有一個郵件應用程序,你可以每分鐘運行一次作爲Windows計劃任務。將其作爲控制檯應用程序。當它加載時,它會檢查它的一個實例是否已經運行,如果有,它就會退出。運行時: 1.嘗試將每封郵件發送到郵件服務器。查詢數據庫以查找TimeToSend比現在更早的所有郵件。
2.如果郵件已發送到郵件服務器,則將其標記爲邏輯刪除。 3.如果有郵件無法發送,請將TimeToSend列提前10分鐘。
4.從表中刪除邏輯刪除的記錄。您可以在應用程序中執行此操作,或者您可以通過執行SQL作業來完成此操作。

0

如前所述,您可以使用通常可以POST JSON的Web服務來使用HTTP請求。這裏有一堆的選擇:(!我們的)

它們都具有不同的功能集和產品,所以肯定會給他們所有旋轉並找出你喜歡的東西。

披露:我PostageApp的產品經理。)

相關問題