2011-11-03 171 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