如何解决如何向超过15000个收件人发送邮件?
| 我们在c#中使用asp.net 3.5,我们必须制作一个功能强大的mailer模块,该模块可以邮寄超过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秒内
让我们提出什么是最好的方法。
提前致谢。
解决方法
不要使用System.Web.Mail。使用System.Net.Mail。请参阅此博客。
不推荐使用System.Web.Mail,不建议这样做。
您需要将工作传递到实际的邮件服务器/服务上。第三方是您的最佳选择。不要直接从Web应用程序代码发送电子邮件,因为请求超时,身份验证超时等最终会终止您的发送循环。另外,此过程将锁定当前页面/会话,直到完成/停止为止,并且当页面执行此类繁重的任务时,我还经历了整个应用程序对所有访问者的锁定。
如果您想要的只是一台便宜的电子邮件服务器,您可以将电子邮件添加到队列中,并且该服务器只是通过电子邮件发送它们,那么Amazon SES值得一看。如果您想要更多的用户管理和广告系列管理工具,那么MailChimp或JangoMail可能是您的最佳选择。
Amazon SES绝对是最便宜的,因为您只需为使用的商品付费。我平均每月花费4美元。
所有这些都提供了可在代码中使用的API。
旁听:请确保您的接收者以某种方式请求或期望接收这些电子邮件。发送垃圾邮件属于违法行为,其处罚严厉。
资源资源
请同时检查以下问题:
您如何从ASP.NET发送大量电子邮件?
如何每周发送100,000封电子邮件?
, 除了Chevex回答:如果您向多个收件人发送电子邮件,请考虑使用密件抄送。如果您使用TO和CC,则每个收件人都会看到他们可能不喜欢的其他收件人的电子邮件地址。
如果要滚动自己的邮件sendig模块而不使用可用的服务之一,则请查看此问题,以了解如何在ASP.NET中运行寿命更长的后台任务的一些方法:在ASP中运行后台任务的最佳方法NET Web应用程序,还可以获得反馈?
,这是我的建议,它使用数据库来管理工作负载。
我将在这里以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
;
只能在以READ COMMITTED或REPEATABLE READ隔离级别运行的事务中指定READPAST。建立新连接时,将设置隔离级别。
现在将发生的事情是,当您使用“ 3”对象创建“ 4”对象时,SQL Server将锁定这些行。其他实例将无法获取它们。这意味着您现在可以有效地为外发电子邮件设置工作队列。但是,请务必记住,在进行处理时必须保持连接处于打开状态,否则将释放锁定。
需要注意的几件事。
您获取一堆行并将其发送。如果成功,则设置IsSent位
如果崩溃(在某处引发异常),则不会丢弃引发ErrorCount的电子邮件。您不删除它,只是增加计数。这很重要,因为如果电子邮件出于某种原因包含输入(而不是由网络连接问题引起),则它可能会继续崩溃以发送客户端,这被称为中毒,它将防止不良数据使发送客户端崩溃。因此,您应该忽略高ѭ5high的电子邮件
您也可以清空滚动时间表,并将SendDate
向前移动,以免一次又一次地吸引相同的事物。
瓶颈将是SmtpClient类,但是根据您希望发送电子邮件的速度,可以根据需要并行处理尽可能多的代理或线程。
优先级将确保如果您需要发送高优先级的电子邮件,则完整的队列不会成为问题。例如如果您想以这种方式发送所有电子邮件,只要队列具有更高的优先级,就不会因为密码已满而延迟发送密码重置或注册电子邮件。
但是要注意的一件事是,当发生错误时,原因是未知的,我已经看到偶尔的网络问题会导致电子邮件无法发送。这种方法通常会发生的情况是,仅当网络连接或SMTP服务器重新联机时,才会在以后发送电子邮件。您还可以使用其他元数据,以不向尝试重设其密码的用户发送多封电子邮件(仅由于某些未知原因,该电子邮件不会立即发送)。
最后一件事。您可能希望将表拆分为两个或三个相同的表。这样做的原因是,如果您想在一段时间内记录已发送的电子邮件,则不希望它们干扰您本来高性能的发送队列,因此您可以将它们移动到单独的表中,只是为了维护历史记录。处理错误的方法相同,如果电子邮件最终导致错误,则可能要记录该错误,然后可以通过将发送队列中的这些电子邮件移到错误队列中来进行记录。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。