Отправка электронной почты SMTP на высоком показателе в.NET

У меня есть сервис.NET, который обрабатывает очередь на фоновом потоке, и от объектов в очереди отсылает большое количество маленьких электронных писем на очень высоком показателе (скажите, что 100 сообщений в секунду, если это даже возможно). В настоящее время я использую SmtpClient.Send() но я боюсь, что это может препятствовать производительности.

Каждый вызов к Send() проходит полный цикл открытия сокета, выполнения разговора SMTP (HELO, ПОЧТА ОТ, ПРИЕМ К, ДАННЫЕ) и закрытие сокета. В псевдо коде:

for each message {
  open socket
  send HELO
  send MAIL FROM
  send RCPT TO
  send DATA
  send QUIT
  close socket
}

(Редактирование: Этот оператор о SmtpClient.Send() на самом деле ложь, как я объяснил в своем ответе.)

Я думал бы, что следующий псевдо код будет более оптимальным:

open socket
send HELO
for each message {
  send MAIL FROM
  send RCPT TO
  send DATA
}
send QUIT
close socket

Если я обеспокоен производительностью SmtpClient.Send() при посылании электронного письма на высокий показатель? Каковы мои опции для оптимизации производительности?

9
задан Martin Liversage 27 April 2010 в 14:47
поделиться

3 ответа

Класс SmtpClient незаметно кэширует подключения к серверу SMTP. Повторный вызов SmtpClient.Send () для отправки нескольких сообщений на один и тот же SMTP-сервер будет эффективно выполнять псевдокод во втором примере.

Одним из способов повышения производительности может быть использование нескольких экземпляров SmtpClient , работающих в нескольких потоках. Вместо одного подключения к SMTP-серверу у службы теперь будет много одновременных подключений. Входящие сообщения электронной почты берутся из очереди и отправляются в пул рабочих потоков, который вызывает SmtpClient.Send () для отправки сообщения на SMTP-сервер.

Я провел несколько элементарных тестов и обнаружил, что это может улучшить производительность на 100%. Однако оптимальное количество одновременных подключений и фактическое улучшение производительности, вероятно, во многом зависят от SMTP-сервера. Один из способов расширить эту идею - подключиться к нескольким SMTP-серверам.

8
ответ дан 4 December 2019 в 21:09
поделиться

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

2
ответ дан 4 December 2019 в 21:09
поделиться

Указан процесс отправки электронной почты с использованием SMTP (изначально) в RFC 821 . С тех пор было много обновлений и дополнений, но основной протокол остался прежним. Вам нужно начинать каждую транзакцию с помощью команды HELO, а затем добавлять информацию об отправителе, получателях и т. Д. Если вы отправляете одно и то же сообщение всем получателям, вы можете добавить несколько получателей в одно сообщение. Однако, если текст сообщения отличается для каждого получателя, я думаю, вам нужно будет отправлять отдельные сообщения каждому из них, что означает отдельную транзакцию для каждого.

0
ответ дан 4 December 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: