【问题标题】:IIS error when sending newsletter using ASP.NET MVC使用 ASP.NET MVC 发送时事通讯时出现 IIS 错误
【发布时间】: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


【解决方案1】:

我发现了很多错误,为什么它不起作用。

第一个是 MailEnable 中的安全设置。在 MailEnableAdmin -> 服务器 -> 本地主机 -> 服务器和连接器 -> 右键单击​​ SMTP 和设置 -> 安全选项卡上,有一个收件人限制(1000)的复选标记。我已经取消选中它并重新启动了服务器。

此后,我的用户列表中有一个无效的电子邮件地址。然后我创建了一个电子邮件检查功能:

    private static bool IsValidEMail(string eMailAddress)
    {
        if (Regex.IsMatch(eMailAddress, @"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase) && new EmailAddressAttribute().IsValid(eMailAddress))
            return true;

        return false;
    }

我已经将我的发送功能更新为

    public static void SendMail(string fromAccount, string toAccount, string subject, string eMailText)
    {
        if (!IsValidEMail(toAccount))
        {
            var invalidEMailAddress = toAccount;

            toAccount = "administrator@YOUR-DOMAIN.com";
            subject = "E-Mail-Address is invalid";
            eMailText = String.Format("Dear Administrator,<br><br>the following E-Mail-Address is invalid:<br><br>{0}", invalidEMailAddress);
        }

        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) { }
            }
        }
    }

和 SendNewsletter-Function 是一样的。现在,所有的电子邮件都出去了。

非常感谢所有提供帮助的用户!

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2012-01-07
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多