我们正在使用带有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秒。
让我们来看看最好的方法是什么。
提前致谢。
不要使用System.Web.Mail。使用System.Net.Mail。看到这个 博客。
不推荐使用System.Web.Mail,不推荐使用。
您需要将工作传递到实际的邮件服务器/服务。第三方是您的最佳选择。不要直接从Web应用程序代码发送电子邮件,因为请求超时,身份验证超时等最终将停止发送循环。此外,此过程将锁定当前页面/会话,直到完成/暂停,并且当页面执行此类繁重任务时,我还遇到了所有访问者锁定的所有应用程序。
如果您想要的只是一个便宜的电子邮件服务器,您可以将电子邮件添加到队列中,服务器只需通过它们并发送它们,然后 亚马逊SES 值得一看。如果您想要更多用户管理和广告系列管理工具,那么 MailChimp 要么 JangoMail 可能是你最好的选择。
亚马逊SES绝对是最便宜的,因为您只需支付使用的费用。我平均每个月花4块钱。
所有这些都提供了可以在代码中使用的API。
除此之外:确保收件人以某种方式请求或以其他方式期待这些电子邮件。发送垃圾邮件是非法的,惩罚是严厉的。
资源
另请查看以下问题:
除了Chevex回答:如果您向多个收件人发送电子邮件,请考虑使用BCC。如果您使用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
;
READPAST只能在以READ COMMITTED或REPEATABLE READ隔离级别运行的事务中指定。您将在建立新连接时设置隔离级别。
现在将会发生的是当你使用时 SqlCommand
对象创建一个 DataReader
SQL Server将锁定这些行。没有其他实例能够获得它们。这意味着您现在可以有效地为外发电子邮件设置工作队列。但重要的是要记住,在进行处理时必须保持连接打开,否则锁将被释放。
有几点需要注意。
- 你获取了一堆行,然后发送它们。如果成功,则设置IsSent位
- 如果崩溃(在某处抛出异常),则不会丢弃引发ErrorCount的电子邮件。你不删除它,你只是提高计数。这很重要,因为如果电子邮件由于某种原因包含输入(而不是由网络连接问题引起),它可能会继续崩溃 发送客户 这称为中毒,它可以防止坏数据崩溃 发送客户。因此,您应该忽略高电子邮件
ErrorCount
- 您也可以清空滚动计划并移动
SendDate
不要一次又一次地尝试同样的事情。
- 瓶颈将是SmtpClient类,但根据您希望发送电子邮件的速度,您可以启动尽可能多的代理或线程,以便并行处理电子邮件。
- 优先级将确保如果您需要发送高优先级电子邮件,则完整队列不会成为问题。例如如果你想以这种方式发送你的所有电子邮件,发送密码重置或注册电子邮件不会因为队列已满而延迟,只要它具有更高的优先级。
有一点需要注意的是,当错误发生时,原因是未知的,我已经看到偶尔的网络问题导致电子邮件无法发送。这种方法通常会发生的情况是,只有在网络连接或SMTP服务器重新联机时才会发送电子邮件。您还可以使用其他元数据,以便不向尝试重置其密码的用户发送多封电子邮件(仅因为某些未知原因,目前尚未发送电子邮件)。
最后一件事。您可能希望将表拆分为两个或三个相同的表。这样做的原因是,如果您想记录已发送的电子邮件一段时间,您不希望它们干扰您的高性能发送队列,因此您只需将它们移动到一个单独的表中,只需保留历史记录即可。这是同样的错误处理,如果电子邮件最终导致错误,您可能想记录它,然后您可以通过将发送队列中的电子邮件移动到错误队列中来实现。