2010-10-07 29 views
2

用戶在我的網站上執行特定操作後,必須將多個郵件發送到不同的電子郵件。是否有可能讓單獨的線程或工作人員負責發送多封電子郵件,以避免在需要發送大量電子郵件時,服務器的響應需要一段時間才能返回?如何通過ASP.NET發送很多電子郵件而不會延遲響應

我想避免使用系統進程或計劃任務,電子郵件隊列。

回答

4

你絕對可以在控制器中產生一個後臺線程來異步處理電子郵件。

我知道你想避免隊列,但我過去做過的另一件事是寫一個windows服務,它從一個數據庫隊列中取出電子郵件並按一定的時間間隔處理它。這樣,如果需要發送大量電子郵件,您可以分開2個應用程序。

+1

對普通線程和'ThreadPool.QueueUserWorkItem'的任何偏好? – Omar 2010-10-08 02:27:00

0

每當類似的操作在事件發生時就會發生,總有可能出現問題。

在ASP.NET中,您可以產生多個線程並讓這些線程執行操作。請確保你告訴它是一個後臺線程的線程,否則可能ASP.NET路爲線程渲染你的頁面之前完成:

myThread.IsBackground = true; 

我知道你說你不想使用系統過程或計劃任務,但Windows服務也是一個可行的方法。該方法將使用MS隊列,或將需要完成的操作保存在DataBase表中。然後每隔一分鐘左右進行一次Windows服務檢查並執行這些操作。

這樣,如果某件事失敗(電子郵件服務器關閉),那些電子郵件/操作仍然可以完成。 他們也將被記錄審計(這是非常好的)。

此方法允許您的網站作爲網站運行,同時將這些任務卸載到另一個服務。您需要的最後一件事情是多個ASP.NET進程用盡等待電子郵件發送。讓別的東西來處理。

0

有幾種方法可以做到這一點。

您可以在數據庫中存儲足夠的有關該消息的詳細信息,並編寫一個Windows服務來循環併發送電子郵件。當用戶提交表單時,只需插入關於該消息的所需數據,並相信該服務將提取它。幾乎是一個你說你不想要的電子郵件隊列,但是你幾乎可以用任何解決方案排隊。

另一種選擇是放入NServiceBus。用於這些類型的任務。

0

我通常會編譯郵件正文並將其存儲在db中的表中,以及from和address,主題以及指示何時發送電子郵件的時間戳。然後我有一個後臺任務定期檢查表,並拉取所有未發送的。此任務嘗試發送每封電子郵件並相應地更新時間戳。預先存儲編譯的消息體的一個優點是後臺任務不需要對上下文特定的數據進行任何處理,因此可以非常簡單。

3

這可以通過許多不同的方式來完成,具體取決於您的應用程序有多大以及您需要哪種可靠性。所有的這些方法可以幫助你實現你想要的(基於複雜升序排列):

  • 如果您正在使用IIS SMTP服務器或支持一個拾取目錄選擇另一郵件服務器,你可以去那。使用此選項,不是直接發送電子郵件,而是先將其保存在拾取目錄中。您的電話會在電子郵件保存在代答目錄後立即返回,因此用戶不必等到電子郵件發送完畢。另一方面,服務器將盡快發送電子郵件,一旦它被保存在提取目錄中,所以它幾乎是即時的(只是沒有阻止呼叫)。

  • 您可以使用後臺線程,如其他答案中所述。你需要小心這個選項,因爲線程可以在它完成工作之前意外結束。您需要添加一些代碼以確保它可靠地工作(個人而言,我不希望使用此選項)。

  • 使用類似MSMQ的消息隊列服務器。這是更多的工作,如果你有一個大規模的應用程序,或者有很好的理由不把第一個選項用於拾取目錄,你可能應該只考慮一下。

+0

用「消息隊列」取代「消息報價」 – 2010-10-12 09:42:52

+0

很好的答案! – 2010-10-12 09:43:14

+0

@Andrei,謝謝。固定。 – 2010-10-13 10:36:41

相關問題