System.Net.Mail.SmtpClient是否在4.7中过时了?

时间:2017-04-20 10:50:09

标签: c# .net

几天前我访问了blogSystem.Net.Mail.SmtpClient已过时,开源库MailKitMimeKit正在取代它。

我可以看到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

5 个答案:

答案 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的连接对象的应用程序专用池。

参考:MailKit Officially Replaces .NET’s SmtpClient

答案 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