【问题标题】:Sending bulk emails from ASP.NET从 ASP.NET 发送批量电子邮件
【发布时间】:2011-05-31 08:42:19
【问题描述】:

在我目前正在编写的博客中,每当用户对某篇文章发表评论时,我都会向所有其他对该帖子发表评论的用户发送电子邮件。在这种情况下,同步或异步发送邮件的最佳方式是什么?任何人都可以共享一个代码 sn-p 用于在 .NET 中使用 System.Net.Mail 向用户列表发送电子邮件。

【问题讨论】:

    标签: asp.net email smtp


    【解决方案1】:

    您可能希望使用单独的网络服务来发送电子邮件。您的应用程序会将正文和电子邮件列表发送到网络服务。您可以使用 gzip 或 zip 压缩。这将使 web 服务调用非常高效(70%+ 压缩,因为数据是文本)。

    现在在网络服务中,您可以使用多线程或异步操作来发送电子邮件。

    编辑:如果您有专用服务器,则制作 Windows 服务可能是更好的选择。在 sql server 中创建两个表,Queued Emails 和 Send Emails(Archive)。因此,每当用户发表评论时,都要更新 Queued emails 表。现在 Windows 服务可以每 30 秒唤醒一次,从排队的电子邮件中提取所有行并异步发送所有这些行。发送电子邮件后,从表中移动/删除该行。

    【讨论】:

    • 这很有趣。从来没想过。
    • 所以?网络服务可以向所有地址发送单独的电子邮件。
    • 我们可以在一个线程中发送所有的电子邮件,还是为每封电子邮件在服务中单独发送一个线程?
    • @LeftX:OP 删除了他的评论。我正在回复他。
    • @Aseem 我删除了我的评论,因为您编辑了您的评论。我试图让事情尽可能简单,并寻找不会增加更多维护和开销的解决方案。我认为维护 web 服务比 windows 服务更容易,并计划使用它。
    【解决方案2】:

    看看这个

    Sending Email with System.Net.Mail

    MailMessage message = new MailMessage();
    message.From = new MailAddress("sender@foo.bar.com");
    
    message.To.Add(new MailAddress("recipient1@foo.bar.com"));
    message.To.Add(new MailAddress("recipient2@foo.bar.com"));
    message.To.Add(new MailAddress("recipient3@foo.bar.com"));
    
    message.CC.Add(new MailAddress("carboncopy@foo.bar.com"));
    message.Subject = "This is my subject";
    message.Body = "This is the content";
    
    SmtpClient client = new SmtpClient();
    client.Send(message);
    

    【讨论】:

    【解决方案3】:

    我用它来异步发送邮件

    SmtpClient smtp = new SmtpClient();
    foreach(var mail in mailsToSend)
    {
       new Thread(() =>
       {
          smtp.Send(mail);
       }
       ).Start();
    }
    

    【讨论】:

    • 在上面的代码中,您正在为每封电子邮件创建一个新线程,尽管我不是异步编程方面的专家,但担心没有。为发送电子邮件而创建的线程数。
    【解决方案4】:

    如果您正在考虑使用第三方服务,有一篇不错的文章介绍了 Amazon's SES Email using .NET 入门。

    这对我来说效果很好,但请注意,SendGrid 刚刚宣布了与亚马逊 SES 相同的新定价,SendGrid 包含一个 SMTP 包装器,因此代码更加简单。

    【讨论】:

    • 听起来不一样。我会调查的。
    【解决方案5】:

    我发布了另一个 StackOverflow 答案,解决了发送大量电子邮件的问题,clicking here 可以找到。

    当然最好是异步发送电子邮件,以便能够在固定时间范围内最大限度地发送电子邮件。您可以自己执行此操作,也可以使用已编写的组件执行此操作。

    我使用Fluent.NET Mail 构建和发送单个电子邮件,我使用MassMailer.NET 发送大量电子邮件。

    Fluent.NET 邮件

    new Mail()
        .Html(new MessageTemplate()
           .FromText("This is my email with {content} text")
           .DataFrom(new { content = "html" })
           .BetweenBraces())
        .To(new MailBox(emailAddress))
        .From(new MailBox(emailAddress))
        .Subject("Fluent API .NET 2")
        .Timeout(5000)
        .SmtpServer("[your smtp server]")
        .SendAsync();
    

    Check out the post.

    MassMailer.NET

    查看这篇文章,了解如何发送大量电子邮件的example

    【讨论】:

      【解决方案6】:
      MailMessage message = new MailMessage();
      
      message.From = new MailAddress("sender@foo.bar.com");
      
      message.To.Add(new MailAddress("recipient1@foo.bar.com"));
      message.To.Add(new MailAddress("recipient2@foo.bar.com"));
      
      message.CC.Add(new MailAddress("carboncopy@foo.bar.com"));
      
      message.Subject = "This is my subject";
      message.Body = "This is the content";
      
      SmtpClient client = new SmtpClient();
      
      client.Send(message);
      

      如果您需要使用NetworkCredential 进行身份验证,您可以找到更多信息herehere
      同步发送?好吧,这取决于您必须发送多少。这可能很耗时。
      在我必须发送大量电子邮件并且我不想挂起我的 Web 服务器的情况下,我开发了一个自定义 Windows 服务,它会定期扫描数据库、收集信息并发送电子邮件。

      【讨论】:

      • 创建用于发送电子邮件的自定义 Windows 服务听起来不错。我会考虑的。
      • @Vijaya Anand:这取决于涉及多少电子邮件。它增加了基础架构的复杂性,但可以肯定的是,您将来不会遇到问题。您甚至可以考虑@Aseem Gautam 解决方案,这似乎很有趣。
      猜你喜欢
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2021-02-08
      • 2014-08-19
      相关资源
      最近更新 更多