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

Nik*_*wal 26 .net c#

几天前我访问了一个过时的博客,System.Net.Mail.SmtpClient一个开源库MailKitMimeKit正在取代它.

我可以看到文档,但没有在参考代码和库中找到相同的文档.它是否过时了?

System.Net.Mail.SmtpClient

Mat*_*zek 13

建议使用开源解决方案,__CODE__而不是SmtpClient,是的.它在库中没有被标记为过时的原因是.NET框架中没有替代品.

  • **这是不正确的**,由于[文档编制过程中的错误](/sf/answers/3625610831/),它被标记为过时。在某些框架中,这应该被标记为已过时,但不是.Net 4.7 **。完整的[GitHub问题信息在这里](https://github.com/dotnet/docs/issues/1876) (3认同)
  • 这似乎很荒谬。Mailkit甚至不提供任何.config。在像.NET这样成熟的框架中,如何像发送电子邮件这样的基本内容却得不到足够的支持? (3认同)
  • **我可以使用**`SmtpClient`来完成所有工作,***我可以使用MailKit-MimeKit进行吗?*** (2认同)

sof*_*dev 10

在.NET Framework 4.7中,它不是过时的。由于存在错误,在API浏览器中无意中记录了该文件自动文档生成,了该文档。但是,它在单声道和Xamarin过时。


vib*_*006 8

Microsoft已正式将.NET类标记为由开放源代码库替代。

SmtpClient现在的文档内容如下:

已淘汰(“ SmtpClient及其类型的网络设计不良,我们强烈建议您改为使用https://github.com/jstedfast/MailKithttps://github.com/jstedfast/MimeKit ”)

SmtpClient的主要问题在于它具有混乱的连接生命周期。

连接到SMTP服务器可能很耗时,尤其是在启用身份验证的情况下,因此每个SmtpClient对象都有一个内部连接池。

这是一个很奇怪的设计。考虑一下典型的数据库连接。当您在上调用Dispose时SqlClient,基础连接将返回到池中。创建new时SqlClient,将检查池中是否存在具有相同连接字符串的活动连接。

使用SmtpClient,调用将Dispose关闭所有连接并耗尽该对象的连接池。这意味着您不能将其与典型的using块模式一起使用

HttpClient不能在中使用共享实例的众所周知方法,例如SmtpClient

好吧,不。与方法不同HttpClientSend/ SendAsync方法不是线程线程安全的。因此,除非要引入自己的同步方案,否则也不能那样使用。实际上,文档SmtpClient警告:

相比之下,MailKit中SMTP客户端表示与单个服务器的简单连接。通过消除内部连接池引起的复杂性,实际上可以更轻松地为MailKit的连接对象创建特定于应用程序的池。

参考:MailKit正式替换.NET的SmtpClient

  • 它并没有过时,它是一个错误,MS 仍在尝试修复:-) https://github.com/dotnet/docs/issues/1876 (2认同)