2012-03-14 183 views
0

簡單說明:我開發一個小型的社交網站有點。發送電子郵件沒有延遲

現在有一個用戶「A」誰擁有100名追隨者...現在我想要做的是,每當用戶「A」在提交網站的一篇文章他所有的追隨者應該獲得與文章鏈接的電子郵件...沒關係,我可以做到。

問題:現在,有一個提交存儲在數據庫中的文章,併發送電子郵件到追隨者在頁面上按鈕......因爲有許多追隨者它需要大量的時間發送電子郵件...所以頁面不斷顯示加載味精直到所有的電子郵件發送..如何我可以發送所有的電子郵件異步?

我指的是文章已經提交之後...的郵件會自動轉到追隨者,而無需把電子郵件在按鈕的點擊事件發送功能....希望我不會混淆你的鄉親。

我可以做些什麼比如將文章存儲在數據庫中,重定向到文章頁面,開始每10分鐘自動發送一批10封電子郵件......只要文章已被提交,該過程就應該開始一個用戶。

回答

0

我會創建一個數據庫表,其中包含有關所有未決電子郵件通知的信息。

當點擊提交時,你可以快速添加行到這個表。
然後,後臺線程可以檢查表併發送郵件(當然也可以從表中刪除成功發送的郵件)。

+0

要注意的是「後臺線程」在IIS/ASP.NET應用程序可能會導致IIS線程池出現問題... – Yahia 2012-03-14 09:49:59

+0

hmmmmm ....你是什麼意思由後臺線程? – user1150440 2012-03-14 09:50:38

+0

@Yahia你有什麼建議? – user1150440 2012-03-14 09:51:11

3

我在批處理電子郵件和其他各種長時間運行的任務中遇到過類似的問題。

我開發了一個包含工作管理器的窗口服務。當需要從主MVC應用程序運行作業時,Web應用程序通過HTTP與服務進行通信(實際上使用JSON),該服務執行實際發送電子郵件或執行其他長時間運行的任務。

這意味着Web應用程序請求立即返回。

網絡應用還可以輪詢服務,以確定在運行任何特定作業的狀態(每個作業被賦予一個唯一標識符)。

+0

請您詳細說明一下或任何代碼samle或文章/發佈你可以引薦我?我是一名學習者。 – user1150440 2012-03-14 09:53:51

-1

您可以使用排隊系統,如MassTransit,ZMQMSMQ

或者......如果你真的想創造一個涼爽的應用程序,你可以在電子郵件任務傳遞給node.js應用!?

+0

-1代表'node.js',當問題明確指出他是C#開發人員時。爲什麼將它與另一種語言障礙複雜化? – 2012-03-14 10:10:59

+0

語言障礙什麼? C#開發人員不知道JavaScript?我會說這是讓事情變得更簡單。 – rogchap 2012-03-14 10:17:11

0

你有沒有想過使用AJAX來實現它?

當用戶按下提交按鈕而不是回發到服務器時,創建2個ajax調用: 第一個是將文章保存到存儲庫(數據庫?)。

從服務器(可以包含文章ID)接收succesfull回答後,第二次調用Ajax調用發送郵件。服務器可以啓動一個線程發送郵件,這樣客戶端的答案將立即生效。

我調用Ajax調用的首選方法是使用JQuery:

$.ajax({ 
    type: "POST", 
    url: "services.aspx/SubmitArticle", 
    data: "{articlecontent: '[put here the content you want to send]'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    error: function(response) { 
     // Handle Error here. The response object contains the error details 
    }, 
    success: function(response) { 
     // Check here if the article has been saved: 
     // response.d property contains the server answer. It can be boolean, 
     // integer, string or any other complex object 

     // If article saved, invoke here the send mail ajax call. assuming the response.d contains 
     // the article id: 
     sendMails(response.d); 

    // sendMails invokes another ajax similiar to this code snippest 
    } 
}); 

在服務器端異步郵件發送方法可以看起來像:

[WebMethod] 
public static bool SendMails(int articleId) 
{ 
    // Add the actual method that send mail to the thread pool 
    ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendMail), articleId); 

    return true; 
} 

private void DoSendMail(object a) 
{ 
    int articleId = (int)a; 
    // Your code that sends mails goes here 
}