如何向超过 15000 个收件人发送邮件?

Posted

技术标签:

【中文标题】如何向超过 15000 个收件人发送邮件?【英文标题】:How to send a mail to more than 15000 recipient? 【发布时间】:2011-09-03 20:26:06 【问题描述】:

我们正在使用带有c#的asp.net 3.5。我们必须制作一个强大的邮件模块。这个模块可以发送超过15000个收件人或DBMS中的所有记录。我想问一些事情。

1)我们有一个代码可以向单个收件人发送邮件。我们将如何向多个收件人发送邮件。我尝试使用我们的代码通过“”添加多个电子邮件 ID,但它只发送第一个电子邮件 ID .这里是代码示例

 public bool Mail(string to, string subject, string body)
        
            try
            

                MailMessage objEmail = new MailMessage();
                objEmail.To =to;
                objEmail.From = "Support@xyz.com";
                //objEmail.Priority =priority

                objEmail.Subject = subject;

                objEmail.Body = body;

                //enable the html tag...

                objEmail.BodyFormat = MailFormat.Html;
                objEmail.Priority = MailPriority.High;

                SmtpMail.SmtpServer = "localhost";

                try
                
                    SmtpMail.Send(objEmail);
                    return true;

                
                catch(Exception ex)
                
                    string error = ex.StackTrace;
                    return false;
                
            
            catch
            
                return false;
            
        

2) 一次发送邮件的最大限制是多少。表示我们可以在包含 emailid 的字符串中分配多少值?

3)我们的代码的一个主要功能是单击按钮,因此如果我们有超过 15000 条记录,那么它是否能够全部发送到邮件,因为我们认为该页面将有 60 秒的时间来呈现,因此它可能只发送邮件这些 id 在 60 秒内覆盖。

让我们建议最好的方法。

提前致谢。

【问题讨论】:

不一定针对您,但可能针对阅读此内容的人:在包括美国在内的许多国家/地区,发送垃圾邮件是非法的,可作为邮件欺诈被判处长达 15 年以上的监禁。 这不是向我们的用户发送有关更新信息的垃圾邮件。 不要在ToCC 字段中添加多个条目。否则,您将向您的用户提供其他用户的电子邮件地址。 【参考方案1】:

不要使用 System.Web.Mail。使用 System.Net.Mail。看到这个blog。

System.Web.Mail 已弃用且不推荐使用。

您需要将工作传递给实际的邮件服务器/服务。第三方是您的最佳选择。不要直接从 Web 应用程序代码发送电子邮件,因为请求超时、身份验证超时等最终会停止发送循环。此外,此过程将锁定当前页面/会话,直到它完成/停止,并且当页面执行此类繁重的任务时,我还经历过为所有访问者锁定的整个应用程序。

如果您想要的只是一个便宜的电子邮件服务器,您可以将电子邮件添加到队列中并且服务器会快速浏览并发送它们,那么Amazon SES 值得一看。如果您想要更多的用户管理和活动管理工具,那么MailChimp 或JangoMail 可能是您的最佳选择。

Amazon SES 绝对是最便宜的,因为您只需按使用量付费。我平均每月花费 4 美元。

所有这些都提供了您可以在代码中使用的 API。

除此之外:请确保您的收件人以某种方式请求或以其他方式期待这些电子邮件。发送垃圾邮件是违法的,处罚很严厉。

资源

还请查看以下问题:

How do you send mass emails from ASP.NET? How to send 100,000 emails weekly?

【讨论】:

请记住,在许多国家/地区,您需要依法提供退订服务。此外,对于 15,000 个地址,您可能希望收集有关退回的电子邮件的信息,以及谁在点击其中的链接。 MailChimp 很棒,可以为您处理所有这些。 www.campaignmonitor.com 也很棒。 @beejam,非常正确。 Amazon SES 向您显示有关反弹的详细信息,并且它们的 API 非常强大。退订很简单。 尽可能多的 prateek(.net 没有限制),但如果您使用 3rd 方 API,您将根据您想要支付的金额限制在一定的金额。请参阅pricing for Amazon SES 以了解您可以与他们一起发送多少以及需要多少费用。当我告诉你这是值得的时,请相信我。在您的服务器上编写自己的电子邮件发送服务是一个巨大的痛苦。 SES 在让您远离垃圾邮件过滤器方面做得非常出色(只要您不发送垃圾邮件 :P),并且它可以很好地跟踪您的反弹。 TO 地址的真正限制是发送它们的 SMPT 服务器,每天允许发送的数量因服务器而异。就像我说的,省去你的头疼并使用第 3 方。 "我可以将多少个收件人添加到 "to" 参数中?"您应该只添加一个。否则,您会损害用户的隐私。【参考方案2】:

除了 Chevex 回答:如果您向多个收件人发送电子邮件,请考虑使用密件抄送。如果您使用 TO 和 CC,每个收件人都会看到他们可能不喜欢的其他收件人的电子邮件地址。

如果您想推出自己的邮件发送模块而不是使用其中一种可用服务,请查看以下问题,了解如何在 ASP.NET 中运行更长时间的后台任务的一些方法:Best way to run a background task in ASP.Net web app and also get feedback?

【讨论】:

+1。另请参阅这些问题:***.com/questions/5902643/…、***.com/questions/3905734/…【参考方案3】:

这是我的建议,它使用数据库来管理工作负载。

我将在这里使用 SQL Server 作为示例,因为这就是我一直在使用的自我。

您所做的是创建一个存储过程和/或将一个表指定为 用于发送电子邮件。除了您需要发送电子邮件的表之外,该表还有以下元数据。

SendDate
IsSent
ErrorCount
Priority

在某些时候,您需要启动一个执行实际工作的线程或进程,但如何实现这一点很有趣。

使用 SQL Server,您可以编写如下查询:

DELCARE @now datetime; SET @now = GETDATE();

SELECT TOP (5) * 
FROM OutgoingEmail WITH (ROWLOCK, READPAST, UPDLOCK) 
WHERE SendDate < @now
    AND IsSent = 0 
    AND ErrorCount < 5
ORDER BY Priority
;

READPAST 只能在以 READ COMMITTED 或 REPEATABLE READ 隔离级别运行的事务中指定。您将在建立新连接时设置隔离级别。

现在会发生的是,当您使用SqlCommand 对象创建DataReader 时,SQL Server 将锁定这些行。没有其他实例能够获得它们。这意味着您现在有效地为外发电子邮件设置了工作队列。但重要的是要记住,在进行处理时必须保持连接打开,否则锁定将被释放。

有几点需要注意。

您获取一堆行并发送它们。如果您成功设置 IsSent 位 如果您崩溃(在某处引发异常),您不会丢弃您引发 ErrorCount 的电子邮件。你不删除它,你只是增加计数。这很重要,因为如果电子邮件由于某种原因包含输入(而不是由网络连接问题引起),它可能会一直崩溃到发送客户端,这称为中毒,它将防止不良数据从使您的发送客户端崩溃。因此,您应该忽略ErrorCount 较高的电子邮件 您还可以清空滚动计划并将SendDate 向前移动,以免时不时地尝试相同的事情。 瓶颈将是 SmtpClient 类,但根据您希望发送电子邮件的速度,您可以启动任意数量的代理或线程来并行处理电子邮件。 优先级将确保如果您需要发送高优先级电子邮件,完整的队列不会成为问题。例如如果您想以这种方式发送所有电子邮件,只要优先级更高,发送密码重置或注册电子邮件就不会因为队列已满而延迟。

需要注意的一点是,当错误发生的原因未知时,我看到偶尔的网络问题会导致电子邮件无法发送。这种方法通常会发生的情况是,电子邮件将在稍后网络连接或 SMTP 服务器重新联机时发送。您还可以拥有额外的元数据,以便不向尝试重置其密码的用户发送超过一封电子邮件(只是因为某些未知原因,电子邮件现在没有被发送)。

最后一件事。您可能希望将表拆分为两个或三个相同的表。这样做的原因是,如果您想在一段时间内记录已发送的电子邮件,您不希望它们干扰您原本高性能的发送队列,因此您将它们移动到单独的表中,只是为了维护历史记录。对错误的处理也是一样的,如果电子邮件最终导致错误,您可能想要记录它,然后您可以通过将发送队列中的这些电子邮件移动到错误队列中来做到这一点。

【讨论】:

以上是关于如何向超过 15000 个收件人发送邮件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用存储在 Excel 中的地址向多个收件人发送电子邮件?

使用 SKPSMTPMessage 向 2​​ 个收件人发送电子邮件

如何使用 python smtplib 向多个收件人发送电子邮件?

从 Zend Framework 应用程序向数百个收件人发送电子邮件的最佳方法是啥?

如何在 SSIS 或 SQL 中使用不同的数据集向不同的收件人发送电子邮件?

在 Laravel 5.4 中向多个抄送收件人发送电子邮件