Отправка массовых писем из ASP.NET - PullRequest
0 голосов
/ 31 мая 2011

В блоге, над которым я работаю в настоящее время, каждый раз, когда пользователь публикует комментарий к статье, которую я хотел бы отправить по электронной почте всем другим пользователям, которые прокомментировали это сообщение.Как лучше всего отправлять письма в этом случае синхронно или асинхронно?Может ли кто-нибудь поделиться фрагментом кода для отправки электронной почты списку пользователей, использующих System.Net.Mail в .NET.

Ответы [ 6 ]

1 голос
/ 31 мая 2011

Возможно, вы захотите использовать отдельный веб-сервис для отправки электронных писем. Ваше приложение отправит тело и список адресов электронной почты на веб-сервис. Вы можете использовать сжатие gzip или zip. Это сделало бы вызов веб-службы очень эффективным (70% + сжатие, поскольку данные являются текстовыми).

Теперь в веб-сервисе вы можете использовать многопоточность или асинхронные операции для отправки электронных писем.

Редактировать: Если у вас есть выделенный сервер, лучше воспользоваться Windows-сервисом. Создайте две таблицы на сервере sql: в очереди электронной почты и отправки электронной почты (архив). Поэтому, когда пользователь публикует комментарий, обновляйте таблицу сообщений в очереди. Теперь служба Windows может просыпаться каждые 30 секунд, извлекать все строки из писем в очереди и отправлять все из них в асинхронном режиме. После отправки письма переместите / удалите строку из таблицы.

0 голосов
/ 07 ноября 2014

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

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

Я использую Fluent.NET Mail для создания и отправки отдельных писем, а я использую MassMailer.NET для отправки больших объемов писем.

Свободно .NET Mail

new Mail()
    .Html(new MessageTemplate()
       .FromText("This is my email with {content} text")
       .DataFrom(new { content = "html" })
       .BetweenBraces())
    .To(new MailBox(emailAddress))
    .From(new MailBox(emailAddress))
    .Subject("Fluent API .NET 2")
    .Timeout(5000)
    .SmtpServer("[your smtp server]")
    .SendAsync();

Проверьте сообщение.

MassMailer.NET

Прочтите этот пост, чтобы пример о том, как отправить большое количество писем.

0 голосов
/ 31 мая 2011

Если вы рассматриваете сторонний сервис, есть хорошая статья о том, как начать работу с Amazon SES Email с использованием .NET .

Для меня это очень хорошо работало, но учтите, что SendGrid только что объявил о новых ценах, равных SES Amazon, SendGrid включает в себя оболочку SMTP, поэтому код еще проще.

0 голосов
/ 31 мая 2011

Я использую это для асинхронной отправки почты

SmtpClient smtp = new SmtpClient();
foreach(var mail in mailsToSend)
{
   new Thread(() =>
   {
      smtp.Send(mail);
   }
   ).Start();
}
0 голосов
/ 31 мая 2011
MailMessage message = new MailMessage();

message.From = new MailAddress("sender@foo.bar.com");

message.To.Add(new MailAddress("recipient1@foo.bar.com"));
message.To.Add(new MailAddress("recipient2@foo.bar.com"));

message.CC.Add(new MailAddress("carboncopy@foo.bar.com"));

message.Subject = "This is my subject";
message.Body = "This is the content";

SmtpClient client = new SmtpClient();

client.Send(message);

Вы можете найти больше информации здесь или здесь , если вам нужно использовать NetworkCredential для аутентификации.
Отправлять это синхронно? Ну, это зависит от того, сколько вы должны отправить. Это может занять много времени.
В ситуации, когда мне приходится отправлять массовые электронные письма и я не хочу зависать на своем веб-сервере, я разрабатываю пользовательские службы Windows, которые периодически сканируют БД, собирают информацию и отправляют электронные письма.

0 голосов
/ 31 мая 2011

Посмотрите на это

Отправка электронной почты с System.Net.Mail

MailMessage message = new MailMessage();
message.From = new MailAddress("sender@foo.bar.com");

message.To.Add(new MailAddress("recipient1@foo.bar.com"));
message.To.Add(new MailAddress("recipient2@foo.bar.com"));
message.To.Add(new MailAddress("recipient3@foo.bar.com"));

message.CC.Add(new MailAddress("carboncopy@foo.bar.com"));
message.Subject = "This is my subject";
message.Body = "This is the content";

SmtpClient client = new SmtpClient();
client.Send(message);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...