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

时间:2011-05-28 07:10:56

标签: c# asp.net .net massmail

我们正在使用带有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秒渲染所以它可能只发送邮件那些ids在60秒内完成。

让我们建议最好的方法是什么。

提前致谢。

3 个答案:

答案 0 :(得分:10)

不要使用System.Web.Mail。使用System.Net.Mail。请参阅此blog

不推荐使用System.Web.Mail,不推荐使用。

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

如果您想要的只是一个便宜的电子邮件服务器,您可以将电子邮件添加到队列中,而服务器只是通过它们并发送它们,那么Amazon SES值得一看。如果您需要更多用户管理和广告系列管理工具,那么MailChimpJangoMail可能是您的最佳选择。

Amazon SES绝对是最便宜的,因为您只需支付所使用的费用。我平均每个月花4块钱。

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

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

资源

请查看以下问题:

答案 1 :(得分:3)

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

如果要滚动自己的邮件sendig模块而不是使用其中一个可用服务,那么请查看此问题,了解如何在ASP.NET中运行更长时间的后台任务的一些方法:Best way to run a background task in ASP.Net web app and also get feedback? < / p>

答案 2 :(得分:0)

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

我将在这里使用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服务器重新联机时,电子邮件将在稍后发送。您还可以使用其他元数据,以便不向尝试重置密码的用户发送多封电子邮件(仅因为某些未知原因,目前尚未发送电子邮件)。

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