ASP.NET电子邮件订阅

时间:2011-11-03 19:17:14

标签: asp.net email

我有一个电子邮件订阅者数据库;约。列表中的1800。我们有自己的交换服务器。我正在使用下面的代码从数据库中获取每个电子邮件地址并一次发送一封电子邮件。我正在使用ASP.NET 4.0 Web窗体来执行此操作。

我发现电子邮件发送时页面已挂起。实现这一目标的最佳方法是什么 - 使用控制台应用程序?我将如何进行压力测试呢?

我还在服务器日志中收到未处理的错误消息:

活动代码: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); 
    }
} 

2 个答案:

答案 0 :(得分:1)

  

我发现电子邮件发送时页面已挂起。什么会   是实现这个的最佳方法 - 使用控制台应用程序?

您可以SendAsync而不是在发送下一封电子邮件之前等待发送一封电子邮件。不过,我不知道你的Exchange服务器会有多少。

您当前的方法存在的问题是,逐个发送1800封电子邮件需要花费大量时间,并且使用网页执行如此长时间的操作可能会超时请求。您可以在async页面上执行此操作并在其自己的线程上启动所有内容,但这只会使您在控制台应用程序中完美地执行此操作时所需的内容更加复杂,而且代码和并发症的线条要少得多。请记住KISS原则。

答案 1 :(得分:1)

另一个(更稳定的)解决方案可能是将邮件转发到(数据库?)队列,并进行一次偶尔排队的Windows服务轮询。如果队列中有新内容,则Windows服务负责发送电子邮件。

这种方法可以帮助您避开网站中的性能问题,并且可以使邮件的传递更加可靠。