Неужели 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

Ответ 2

Он не устарел в .NET Framework 4.7. Это было непреднамеренно задокументировано как таковое в браузере API из-за ошибки в автоматизированном генераторе документации. Тем не менее, он устарел в Моно и Xamarin.

Ответ 3

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.

Ссылка: MailKit официально заменяет .NETs SmtpClient