【发布时间】:2016-05-26 12:59:29
【问题描述】:
在我的 mvc-helper 类中发送简报(大约 5000 人)时遇到问题。
public static void SendNewsletter(string fromAccount, string subject, string eMailText)
{
var userEMailAddresses = new List<string>();
using (var dbContext = new dbEntities())
{
userEMailAddresses =
dbContext
.User
.Where(w =>
!w.IsDeactivated &&
!w.IsBlacklisted)
.Select(s =>
s.UserName)
.ToList();
}
new Thread(() =>
{
for (int i = 0; i < userEMailAddresses.Count; i++)
{
SendMail(fromAccount, userEMailAddresses[i], subject, eMailText);
}
}).Start();
}
这是我的函数,将在控制器中调用。下一个 Code-Block 是发送函数。
public static void SendMail(string fromAccount, string toAccount, string subject, string eMailText)
{
var fromEmailAddress = new EMailModel(fromAccount);
var body = string.Empty;
using (var sr = new StreamReader(HostingEnvironment.MapPath("\\App_Data\\Templates\\") + "EMailTemplate.txt"))
{
body = sr.ReadToEnd();
}
body = body.Replace("%%Subject%%", subject);
body = body.Replace("%%Body%%", eMailText);
body = body.Replace("%%Year%%", DateTime.Now.Year.ToString());
using (MailMessage mail = new MailMessage(fromEmailAddress.EMailAddress, toAccount))
{
mail.Subject = subject;
mail.Body = WebUtility.HtmlDecode(body);
mail.IsBodyHtml = true;
using (SmtpClient smtp = new SmtpClient(Statics.SmtpClient, Statics.SmtpPort))
{
smtp.UseDefaultCredentials = false;
smtp.Credentials = new System.Net.NetworkCredential(fromEmailAddress.EMailAddress, fromEmailAddress.Password);
smtp.EnableSsl = Statics.SslEnabled;
try
{
smtp.Send(mail);
Thread.CurrentThread.Join(1000);
}
catch (Exception ex) {
throw ex;
}
}
}
}
大约 1300 封电子邮件后,我的 IIS 收到以下错误:
我该如何解决这个问题?我需要时事通讯系统...
【问题讨论】:
-
Thread.CurrentThread.Join(1000);??? -
我们的邮件系统在处理太多电子邮件后刚刚崩溃。看起来我们的邮件服务器被阻塞了,所以我们设置了一个循环计数器和一个挂起时间,即处理 10 封电子邮件,等待 10 秒,冲洗并重复。它现在工作正常,也许值得对你的情况进行调查?
-
就我个人而言,我很想使用久经考验的异步发送和结束,而不是重新发明轮子……例如 EASendMail ...emailarchitect.net/easendmail/kb/csharp.aspx?cat=13
-
正如 Hugo 所说.. 确保电子邮件服务器上没有垃圾邮件过滤器,例如1 分钟内发送 100 多封电子邮件 = 垃圾邮件 = 阻止... 路由上是否有任何病毒检查?因为他们也可以有垃圾邮件过滤器。
-
@FalcoAlexander Thread.CurrentThread.Join(1000) 与 Thread.Sleep(1000) 相同。
标签: c# asp.net asp.net-mvc iis