几天前我访问了blog,System.Net.Mail.SmtpClient
已过时,开源库MailKit和MimeKit正在取代它。
我可以看到docs,但在reference code和库中找不到相同内容。它是否过时了?
[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
答案 0 :(得分:13)
建议使用MailKit
等开源解决方案代替SmtpClient,是的。它在库中没有被标记为过时的原因是.NET框架中没有替代品。
答案 1 :(得分:8)
Microsoft已正式将.NET类标记为由开放源代码库替代。
SmtpClient
的文档现在显示为
已过时(“ SmtpClient及其类型的网络设计不良,我们 强烈建议您使用https://github.com/jstedfast/MailKit和 https://github.com/jstedfast/MimeKit代替”)
SmtpClient的主要问题在于它的连接生命周期令人困惑。
连接到SMTP服务器可能很耗时,尤其是在启用身份验证的情况下,因此每个SmtpClient
对象都有一个内部连接池。
这是一个很奇怪的设计。考虑一下典型的数据库连接。当您在SqlClient
上调用Dispose时,基础连接将返回到池中。创建新的SqlClient
时,将检查该池中是否存在具有相同连接字符串的活动连接。
使用SmtpClient
,调用Dispose
将关闭所有连接并耗尽该对象的连接池。 这意味着您不能将其与典型的using
阻止模式一起使用。
在HttpClient
中不能使用共享实例的众所周知的方法,例如 SmtpClient
。
嗯,不。 ,与HttpClient
不同的是,Send
/ SendAsync
方法不是线程线程安全的。因此,除非您想引入自己的同步方案,否则也不能那样使用。实际上,SmtpClient
的文档会发出警告,
相比之下,MailKit中的 SMTP客户端代表一个简单的 连接到单个服务器。通过消除造成的复杂性 通过内部连接池,实际上可以更轻松地创建一个 MailKit的连接对象的应用程序专用池。
答案 2 :(得分:8)
.NET Framework 4.7中的不是已过时。由于自动文档生成器中的bug,它被无意中记录在API浏览器中。但是, 在Mono和Xamarin中已过时。
答案 3 :(得分:1)
截止到今天,SmtpClient in .NET Core 3.1可用,但官方文档将其标记为已过时,并建议不要使用它(对于OP的问题,答案为否,在.NET Framework 4.7中尚未过时)。 / p>
SmtpClient类在Xamarin中已作废。但是:
它包含在.NET Standard 2.0和更高版本中,因此必须是支持这些功能的任何.NET实现的一部分。 版本。
它存在并且可以通过.NET Framework 4.8在.NET Framework 4中使用。
它在.NET Core中可用,但不建议使用。
答案 4 :(得分:0)
我在System.Obsolete
中找不到SmtpClient类的.NET Framework 4.7.2
的任何痕迹。这是否意味着该课程将不再过时?
因为在docs.microsoft.com中明确指出,This API is now obsolete.
编辑:
SmtpClient尚未过时,这是由于文档中的错误所致。 请参阅问题here。