Как отправить письмо нескольким получателям - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу отправлять электронные письма нескольким получателям в ASP.NET MVC, и мне это сложно.Мой код отправляет только на первый адрес электронной почты в списке, но я хочу отправить около 400 получателей одновременно.Адреса этих получателей хранятся в базе данных 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);
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Из кода похоже, что вы собираетесь разослать всем одинаковые письма?Если это так, возможно, вам следует рассмотреть возможность использования BCC для всех ваших получателей!Таким образом, вам нужно отправить только одно письмо.Большинство почтовых серверов нуждаются в некотором регулировании при массовом отправлении почты, поэтому чем меньше элементов, тем лучше.

0 голосов
/ 25 сентября 2018

Вам нужно переместить перенаправление (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) Это довольно длительный процесс, что происходит, если соединение между клиентом и сервером становится разделенным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...