Отправка массовой электронной почты в ASP.NET - PullRequest
3 голосов
/ 03 апреля 2012

Это мой код для отправки большого количества писем. Я хочу оптимизировать этот код, чтобы быть уверенным, что он будет работать и сможет успешно отправлять все электронные письма. Что я должен делать? Я знаю, что установка прерываний между отправками может быть полезной, но как я могу это сделать?

Основная проблема состоит в том, чтобы не классифицировать электронные письма как спам и уменьшать количество отправленных сообщений с ошибками.

var list = from c in context.Emails orderby c.EmailAddress select c.EmailAddress;
MailMessage mail = new MailMessage();
try
{
    mail.From = new MailAddress(txtfrom.Text);
    foreach (var c in list)  
    {  
        mail.To.Add(new MailAddress(c.ToString()));
    }
    mail.Subject = txtSub.Text;
    mail.IsBodyHtml = true;
    mail.Body = txtBody.Text;
    if (FileUpload1.HasFile)
    {
        mail.Attachments.Add(new Attachment(
           FileUpload1.PostedFile.InputStream, FileUpload1.FileName));
    }
    SmtpClient smtp = new SmtpClient();
    smtp.Send(mail); 
}
catch (Exception)
{
    //exception handling
}

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Я бы посоветовал вам не добавлять всех получателей в одно и то же почтовое сообщение.

Скорее используйте этот код:

mail.From = new MailAddress(txtfrom.Text);
mail.Subject = txtSub.Text;
mail.IsBodyHtml = true;
mail.Body = txtBody.Text;
if (FileUpload1.HasFile)
{
    mail.Attachments.Add(new Attachment(FileUpload1.PostedFile.InputStream, FileUpload1.FileName));
}
SmtpClient smtp = new SmtpClient();
foreach (var c in list)  
{  
    mail.To.Clear();
    mail.To.Add(new MailAddress(c.ToString()));
    smtp.Send(mail);
}
1 голос
/ 03 апреля 2012

С небольшой тщательностью это можно сделать с помощью очень простого консольного приложения, которое можно вызвать из веб-формы для отправки электронных писем. Под усердием я подразумеваю вставить паузу между партиями, чтобы почтовый сервер не зависал. Например, если вы берете адреса из БД и отправляете их, у вас может быть что-то вроде:

if ((count >= 100) && (count % 100 == 0))
    Thread.Sleep(30000);
-----------------------------------------

// Код веб-формы

// Передать тему и строки сообщения как параметры в консольное приложение

ProcessStartInfo info = new ProcessStartInfo();

string arguments = String.Format(@"""{0}"" ""{1}""",
     subjectText.Text.Replace(@"""", @""""""),
     messageText.Text.Replace(@"""", @""""""));
info.FileName = MAILER_FILEPATH;

Process process = Process.Start(info.FileName, arguments);
Process.Start(info);

Подробнее здесь: Вызов консольного приложения из веб-формы

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