【问题标题】:How to send email to multiple recipients如何向多个收件人发送电子邮件
【发布时间】:2019-03-01 08:47:40
【问题描述】:

我想在 ASP.NET MVC 中向多个收件人发送电子邮件,我觉得这很有挑战性。我的代码只发送到列表中的第一个电子邮件地址,但我想一次发送给大约 4​​00 个收件人。这些收件人的地址存储在 SQL Server 数据库中。这是我的代码

[HttpPost]
[ValidateInput(false)]
public ActionResult SendBulkEmail(EmailAddress ea, HttpPostedFileBase postedFile)
{
    string senderEmail = System.Configuration.ConfigurationManager.AppSettings["senderEmail"].ToString();
    string senderPassword = System.Configuration.ConfigurationManager.AppSettings["senderPassword"].ToString();

    if (ModelState.IsValid)
    {


        SqlDataReader reader;
        using (SqlConnection cs = new SqlConnection(conn))
        {
            cs.Open();
            SqlCommand cmd = new SqlCommand("SELECT email_address FROM Newsletter", cs);

            ArrayList emailArray = new ArrayList();
            reader = cmd.ExecuteReader();

            myFunctions m = new myFunctions();
            var emailList = m.LoadEmails();
            var emails = new List<AllEmailAddresses>();

            while (reader.Read())
            {
                emails.Add(new AllEmailAddresses
                {
                    EmailAddress = Convert.ToString(reader["email_address"])
                });
            }

            foreach (AllEmailAddresses email in emailList)
            {
                try
                {
                    SmtpClient client = new SmtpClient("mail.chijiokechinedu.com", 25);
                    client.Timeout = 100000;
                    client.DeliveryMethod = SmtpDeliveryMethod.Network;
                    client.UseDefaultCredentials = false;
                    client.Credentials = new NetworkCredential(senderEmail, senderPassword);

                    //MailMessage mailMessage = new MailMessage(senderEmail, email.EmailAddress, ea.EmailSubjest, ea.EmailBody);
                    MailMessage mailMessage = new MailMessage();
                    mailMessage.From = new MailAddress(senderEmail);
                    mailMessage.To.Add(new MailAddress(email.EmailAddress));
                    mailMessage.Subject = ea.EmailSubjest;
                    mailMessage.Body = ea.EmailBody;
                    mailMessage.IsBodyHtml = true;
                    mailMessage.BodyEncoding = UTF8Encoding.UTF8;
                    if (postedFile != null)
                    {
                        string fileName = Path.GetFileName(postedFile.FileName);
                        mailMessage.Attachments.Add(new Attachment(postedFile.InputStream, fileName));
                    }

                    client.Send(mailMessage);
                    return RedirectToAction("EmailSentSuccessfully", "Home");
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

    }
    else
    {
        ModelState.AddModelError("", "email failed to send!");
    }
    return View(ea);
}

【问题讨论】:

  • 应该很简单。你在错误的地方循环。您需要循环这个:mailMessage.To.Add(new MailAddress(email.EmailAddress));,而不是循环实际发送电子邮件。您要添加多个收件人,而不是发送多封电子邮件。并删除该尝试/捕获。如果您只是要重新抛出异常,那么捕获异常是没有意义的。而AllEmailAddresses 对于只包含一个电子邮件地址的对象来说是一个糟糕的名称。
  • 为了避免超时和其他问题,我强烈建议您从数据库中提取所需的所有数据,关闭数据库连接,然后发送电子邮件
  • 谢谢大家。它现在工作,我真的很感激。

标签: c# asp.net-mvc smtpclient


【解决方案1】:

您需要将重定向 (return RedirectToAction("EmailSentSuccessfully", "Home");) 移动到该功能的底部,因为您发送第一封电子邮件后,它将重定向

[HttpPost]
[ValidateInput(false)]
public ActionResult SendBulkEmail(EmailAddress ea, HttpPostedFileBase postedFile)
{
    string senderEmail = System.Configuration.ConfigurationManager.AppSettings["senderEmail"].ToString();
    string senderPassword = System.Configuration.ConfigurationManager.AppSettings["senderPassword"].ToString();

    if (ModelState.IsValid)
    {


        SqlDataReader reader;
        using (SqlConnection cs = new SqlConnection(conn))
        {
            cs.Open();
            SqlCommand cmd = new SqlCommand("SELECT email_address FROM Newsletter", cs);

            ArrayList emailArray = new ArrayList();
            reader = cmd.ExecuteReader();

            myFunctions m = new myFunctions();
            var emailList = m.LoadEmails();
            var emails = new List<AllEmailAddresses>();

            while (reader.Read())
            {
                emails.Add(new AllEmailAddresses
                {
                    EmailAddress = Convert.ToString(reader["email_address"])
                });
            }

            foreach (AllEmailAddresses email in emailList)
            {
                SmtpClient client = new SmtpClient("mail.chijiokechinedu.com", 25);
                client.Timeout = 100000;
                client.DeliveryMethod = SmtpDeliveryMethod.Network;
                client.UseDefaultCredentials = false;
                client.Credentials = new NetworkCredential(senderEmail, senderPassword);

                //MailMessage mailMessage = new MailMessage(senderEmail, email.EmailAddress, ea.EmailSubjest, ea.EmailBody);
                MailMessage mailMessage = new MailMessage();
                mailMessage.From = new MailAddress(senderEmail);
                mailMessage.To.Add(new MailAddress(email.EmailAddress));
                mailMessage.Subject = ea.EmailSubjest;
                mailMessage.Body = ea.EmailBody;
                mailMessage.IsBodyHtml = true;
                mailMessage.BodyEncoding = UTF8Encoding.UTF8;
                if (postedFile != null)
                {
                    string fileName = Path.GetFileName(postedFile.FileName);
                    mailMessage.Attachments.Add(new Attachment(postedFile.InputStream, fileName));
                }

                client.Send(mailMessage);
            }

            // ** redirect after sending all the emails
            return RedirectToAction("EmailSentSuccessfully", "Home");
        }

    }
    else
    {
        ModelState.AddModelError("", "email failed to send!");
    }
    return View(ea);
}

但是,由于以下问题,您可能想要改造您的方法并将其放在队列后面:

1) 如果在 10 封电子邮件之后有一封失败会发生什么?剩下的你怎么办?

2) 这是一个相当长的运行过程,如果客户端和服务器之间的连接被隔离会发生什么?

【讨论】:

  • 谢谢凯文·史密斯,我把 (return RedirectToAction("EmailSentSuccessfully", "Home");) 移到了底部,现在它工作得很好。我真的很感谢你的帮助。其次,您能帮助我如何改造我的方法吗?
  • 完全取决于你运行它的真正...我会考虑将它们排队以便稍后处理,无论是 AWS SQS 还是 Azure 存储队列等等……
【解决方案2】:

从代码看来,您要向所有人发送完全相同的电子邮件? 如果是这种情况,也许您应该考虑为所有收件人使用密件抄送! 这样,您只需发送一封电子邮件。当您批量发送邮件时,大多数邮件服务器都需要某种限制,因此邮件越少越好。

【讨论】:

  • 非常感谢 Joost Verdaasdonk。我想知道这段代码是否会实现这一点。 MailMessage mailMessage = new MailMessage(); mailMessage.From = new MailAddress(senderEmail); foreach(电子邮件列表中的 AllEmailAddresses 电子邮件){ mailMessage.Bcc.Add(new MailAddress(email.EmailAddress)); }
猜你喜欢
  • 2012-05-18
  • 2019-04-22
  • 2017-12-05
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多