Я полагаю, что класс SmtpClient не использует одно и то же соединение для каждого отправленного письма (отредактируйте: теперь это возможно в .NET 4.0, см. Различия в документации для SmtpClient ). Открытие нового соединения стоит дорого, и это, вероятно, то, что требует времени. Есть коммерческие компоненты SMTP, которые делают и предлагают гораздо более высокую производительность. В зависимости от SMTP-сервера и размера почты, можно достичь чего-то вроде как минимум 50 писем в секунду.
Однако это может не быть проблемой для вас, если вы немного измените архитектуру. Что я делаю в своем приложении, так это то, что SmtpClient доставляет почту в папку, используя smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory и устанавливая PickupDirectoryLocation в требуемый каталог. Для этого вместо отправки почтовых сообщений по сети он записывает их в указанную папку как стандартные сообщения MIME (формат .eml).
Здесь вы можете использовать SMTP-сервер IIS или просто создать другой фоновый поток / процесс для использования созданных файлов .eml и доставки их получателям или другому SMTP-серверу.
Этот подход, я думаю, намного лучше, просто потому что:
- Клиентский код, отправляющий письмо, никогда не должен ждать фактической отправки почты, что может занять значительное время, в зависимости от скорости соединения, задержки и т. Д.
- Если отправленная почта не удалась, код клиента не будет затронут. Почту можно отправить в другое время в фоновом режиме.
- Почтовая очередь постоянна, если приложение будет остановлено и запущено снова, почта в очереди не будет потеряна.
- Проще для тестирования.
В качестве более простого подхода вы можете использовать SendAsync вместо Send, но он не дает всех непосредственных подходов, которые даст подход PickupDirectory.