Ответ 1
Как отметил Лиам, это устарело из-за ошибки в документации. Является ли System.Net.Mail.SmtpClient устаревшим в 4.7?
Несколько дней назад я посетил блог, в котором говорилось, что System.Net.Mail.SmtpClient
устарел, и его заменяет библиотека с открытым исходным кодом MailKit и MimeKit.
Я могу видеть документы для этого, но не могу найти то же самое в справочном коде и в библиотеке. Это устарело или нет?
[System.Obsolete("SmtpClient and its network of types are poorly designed, we strongly recommend you use https://github.com/jstedfast/MailKit and https://github.com/jstedfast/MimeKit instead")]
public class SmtpClient : IDisposable
Как отметил Лиам, это устарело из-за ошибки в документации. Является ли System.Net.Mail.SmtpClient устаревшим в 4.7?
Он не устарел в .NET Framework 4.7. Это было непреднамеренно задокументировано как таковое в браузере API из-за ошибки в автоматизированном генераторе документации. Тем не менее, он устарел в Моно и Xamarin.
Microsoft официально пометила класс .NET как заменяемый библиотекой с открытым исходным кодом.
Документация для SmtpClient
теперь гласит:
Устаревший ("SmtpClient и его сеть типов плохо спроектированы, поэтому мы настоятельно рекомендуем использовать вместо него https://github.com/jstedfast/MailKit и https://github.com/jstedfast/MimeKit ")
Основная проблема с SmtpClient заключается в том, что у него запутанный жизненный цикл соединения.
Подключение к SMTP-серверу может занять много времени, особенно если включена аутентификация, поэтому каждый объект SmtpClient
имеет внутренний пул соединений.
Это довольно странный дизайн. Рассмотрим на секунду типичное соединение с базой данных. Когда вы вызываете Dispose для SqlClient
, базовое соединение возвращается в пул. Когда вы создаете новый SqlClient
, пул проверяется на наличие активного соединения с той же строкой соединения.
При SmtpClient
вызов Dispose
закрывает все соединения и сливает этот пул соединений объектов. Это означает, что вы не можете использовать его с типичным using
шаблона блока.
Хорошо известный подход общего экземпляра, такого как HttpClient
нельзя использовать в SmtpClient
.
Ну нет. В отличие от HttpClient
, методы Send
/SendAsync
не являются поточно- SendAsync
. Так что, если вы не хотите ввести свою собственную схему синхронизации, вы не можете использовать ее также. На самом деле, документация для SmtpClient
предупреждает,
В отличие от этого, SMTP-клиент в MailKit представляет собой простое соединение с одним сервером. Устраняя сложность, вызванную внутренними пулами подключений, фактически упрощает создание прикладного пула для объекта подключения MailKits.
добавлен эффективный способ преобразования старого кода в новый с минимальными усилиями. https://github.com/jinthakur/smptpmailclient-top-mailkitclient/blob/master/README.md