2011-11-03 144 views
0

我有一個電子郵件訂閱者的數據庫;約。 1800名單中。我們有我們自己的交換服務器。我使用下面的代碼從數據庫中獲取每個電子郵件地址,並一次一個地發送電子郵件。我正在使用ASP.NET 4.0 Web窗體來執行此操作。ASP.NET電子郵件訂閱

我注意到電子郵件正在發送時掛起的頁面。什麼是實現這個最好的方法 - 使用控制檯應用程序?我將如何去測試像這樣的壓力測試?

我也是在服務器日誌得到一個未處理的錯誤消息:

事件代碼:3001 事件消息:請求已經中止。

// Call data access method via business class 
TaxSalesBusiness bizClass = new TaxSalesBusiness(); 
DataSet ds = bizClass.GetSubscribers(); 

foreach (DataRow row in ds.Tables[0].Rows) 
{ 
    // Check well-formedness of each email adddress 
    if (!IsWellformedEmailAddr(row["Email"].ToString())) 
    { 
     // Ignore and log mal-formed email address 
     LogError(row["Email"].ToString() 
      + " is a malformed email address. Message was not sent to this subscriber " 
      + row["Name"].ToString() + ".", ""); 
     continue; 
    } 
    else 
    { 
     string toAddress = row["Email"].ToString(); 
     smtpClient.Send(fromAddress, toAddress, message.Subject, message.Body); 
    } 
} 

回答

1

我注意到,當被髮送的電子郵件的網頁掛。 是實現這一目標的最佳方法 - 使用控制檯應用程序?

是的。

而你可以SendAsync而不是在發送下一個電子郵件之前等待發送一封電子郵件。不過,我不知道你的Exchange服務器會多少。

您目前的做法存在的問題是,逐個發送1800封電子郵件需要花費大量時間,並且使用網頁執行如此長的操作可能會超時請求。你也許可以在async頁面上完成它,並且可以在自己的線程上啓動所有的東西,但這隻會讓你的控制檯應用程序完全做到這一點,而且代碼和複雜程度更低。請記住KISS原則。

+0

+1,謝謝。測試所有正在發送的電子郵件的最佳方式是什麼? – IrishChieftain

+0

@IrishChietain:我想你會問,因爲你想異步發送它們......你可以保留一個計數器,因爲你事先知道了你有多少條記錄(即'int totalEmailsToSend = ds.Tables [0] .Rows.Count' )。當調用回調方法時,您可以增加計數器。一旦他們都是平等的(totalEmailsToSend和你的櫃檯),你知道你已經完成了。 – Icarus

1

另一個(更穩定的)解決方案可能是將郵件轉發到(數據庫?)隊列,並且有一個稍後排隊的Windows服務輪詢。如果隊列中有新事物,則Windows服務負責發送電子郵件。

此方法將幫助您清除網站中的性能問題,並且可以使郵件的傳遞更加可靠。

+0

這是一個很好的觀點。如果使用Sql Server,他可以非常容易地在Sql Server中發送電子郵件:http://stackoverflow.com/questions/7265494/sql-server-send-email/7265512#7265512 – Icarus

+0

只是爲了澄清:這個列表是email-每隔幾年爆炸一次;例如,某人僅訂閱電子郵件就不會生成電子郵件。此外,我正在使用SQL Server 2000 - 所以不確定任何電子郵件功能的限制。 – IrishChieftain