使用ASP.Net中的SMTP服务器批量邮寄

时间:2010-09-20 10:21:34

标签: c# asp.net

我们正在向所有已注册此服务的用户发送免费通讯。由于这些简报是免费发送的,我们预计一个月内至少有5000个订阅者。我担心使用SMTP服务器概念的批量邮件是否会引起一些问题。首先,我们考虑开发一种Windows服务,该服务会定期向订阅者自动发送邮件,但业务用户已经要求管理员可以编辑新闻简报,然后只邮寄给用户,因此我们必须在网站本身开发此功能! 。我在数据表中获取特定用户的订阅者,然后向内部的每个用户发送for循环,这会导致任何性能问题吗? 代码粘贴在下面:

dsEmailds.Tables [0]包含简报订阅者列表。

for (iCnt = 0; iCnt < dsEmailIds.Tables[0].Rows.Count; iCnt++)
{
    MailMessage msg = new MailMessage();
    msg.From = new MailAddress("newsletters@domainname.com", "test1");
    msg.To.Add(dsEmailIds.Tables[0].Rows[iCnt]["mailid"]);
    msg.IsBodyHtml = true;
    msg.Subject = subject;
    AlternateView av1 = AlternateView.CreateAlternateViewFromString(MailMsg, null, System.Net.Mime.MediaTypeNames.Text.Html);
        av1.LinkedResources.Add(lnkResLogo);
        av1.LinkedResources.Add(lnkResSalesProperty);
        av1.LinkedResources.Add(lnkResLeaseProperty);
        msg.AlternateViews.Add(av1);

SmtpClient objSMTPClient = new SmtpClient(System.Configuration.ConfigurationManager.AppSettings["mailserver"].ToString());
objSMTPClient.DeliveryMethod = SmtpDeliveryMethod.Network;
objSMTPClient.Send(msg);
}         

任何建议都会很棒!

4 个答案:

答案 0 :(得分:4)

你应该停止并考虑所有事情:

  • 黑名单:有了这笔金额,您肯定会在严重的ISP /邮件服务器中列出,并且您需要证明收到的用户要求提供此类电子邮件并等待1到他们删除标志时的3个月过程

  • 您需要以块发送电子邮件,每次不超过250封,使用不同的IP机器发送更多电子邮件(更多块)

请阅读一些很好的指导方针来完成所有这些操作,您可以在MailChimpCampaign Monitor

中找到它
  

Free Email Marketing Guides

您应该使用像Mailchimp这样的服务(现在可以免费获得1000个订阅,每月发送3000个),但价格为very cheap他们有一个API ,您可以轻松添加,创建,发送,你将得到所有关于如何打开,他们做了什么等等的好报告......

广告系列监控也很棒,但有点more expensive,但很棒,因为您可以将整个用户界面品牌化并作为服务销售给您的客户(如果您是想在不久的将来做这样的事情)。

我希望它有所帮助。

试一试,我是一个快乐的客户。

答案 1 :(得分:1)

我看到的主要问题是您可能会遇到页面超时。在我看来,最好的方法是设置一个服务,通过从队列中读取来处理与邮件相关的使用(例如模板化)。您的网站可以发布您希望在队列中发送的邮件,然后提供基本管理面板来管理服务并获取一些统计信息。

你可以使用开源和放大器用于队列的xcopy友好系统(如Rhino队列,ServiceBus)和Topshelf(如果您想轻松设置)

但我建议您不要在网页上发送批量电子邮件

答案 2 :(得分:0)

有一个SendAsync方法实际上将这些请求排队并从您的线程发送它们异步。这样你就可以防止超时,你可以在几秒钟内发送(即排队)5000封电子邮件。

答案 3 :(得分:0)

  • 写入计算机上运行的SMTP服务器的提取队列(IIS包含一个)。这是最快速,最有效的方法。

OR

  • 在代码中设置自定义线程池并将任务卸载到它。这样,来自ASP.NET线程池的工作线程就可以为传入的请求提供服务,并且不会被发送邮件占用(这取决于您的服务器负载有多高,当然 - 使用异步方法继续使用ASP.NET线程池如果你不关心负载/可以负担得起它。)