【问题标题】:Is System.Net.Mail.SmtpClient obsolete in 4.7?System.Net.Mail.SmtpClient 在 4.7 中是否已过时?
【发布时间】:2017-04-20 10:50:09
【问题描述】:

几天前我访问了一个blog,它说System.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

【问题讨论】:

  • 看起来很可能(见之前的评论)这是一个文档错误。
  • 它不是“MSDN”文档,而是新的 Microsoft Docs。这足以判断在大多数情况下是否有任何内容已过时,因为文档与源文件是分开的,并且可以更频繁地更新以反映最新的更改。微软计划将文档移回源文件,但进展并不如所有人所愿。
  • 文档并非都是人工生成的。其中大部分是通过最终二进制文件的反射完成的。

标签: c# .net


【解决方案1】:

正如 Liam 指出的,由于文档中的错误,这已过时。 Is System.Net.Mail.SmtpClient obsolete in 4.7?

【讨论】:

【解决方案2】:

它在 .NET Framework 4.7 中没有过时。由于自动文档生成器中的bug,它在 API 浏览器中被无意记录。但是,它在 Mono 和 Xamarin 中已过时。

【讨论】:

    【解决方案3】:

    ... Microsoft 已正式将 .NET 类标记为被开源库取代。 SmtpClient 的文档现在显示,

    Obsolete("SmtpClient 及其网络类型设计不佳,我们 强烈建议您使用https://github.com/jstedfast/MailKithttps://github.com/jstedfast/MimeKit 而不是")

    SmtpClient 的主要问题是它的连接生命周期很混乱。 连接到 SMTP 服务器可能很耗时,尤其是在启用身份验证的情况下,因此每个 SmtpClient 对象都有一个内部连接池。

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

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

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

    HttpClient 不同,Send/SendAsync 方法不是线程线程安全的。所以除非你想引入自己的同步方案,否则你也不能那样使用它。事实上,SmtpClient 的文档警告,

    无法确定应用程序何时使用 SmtpClient 对象完成并且应该清理它。

    相比之下,MailKit 中的 SMTP 客户端代表了一个简单的 连接到单个服务器。 通过消除导致的复杂性 通过内部连接池,它实际上更容易创建一个 MailKit 连接对象的特定应用程序池。

    参考:MailKit Officially Replaces .NET's SmtpClient

    【讨论】:

    【解决方案4】:

    截至今天,SmtpClient in .NET Core 3.1 可用,但官方文档将其标记为已过时并建议不要使用它(对于 OP 的问题,答案是否定的,它在 .NET Framework 4.7 中并没有过时)。

    SmtpClient 类在 Xamarin 中已过时。然而:

    • 它包含在 .NET Standard 2.0 和更高版本中,因此必须是任何支持这些功能的 .NET 实现的一部分 版本。

    • 它存在并且可以在 .NET Framework 4 到 .NET Framework 4.8 中使用。

    • 它在 .NET Core 中可用,但不推荐使用。

    【讨论】:

    【解决方案5】:

    我在 SmtpClient 类的.NET Framework 4.7.2 中找不到任何System.Obsolete 的踪迹。这是否意味着这个类不再过时了?

    因为在docs.microsoft.com 中明确指出,This API is now obsolete.

    编辑:

    SmtpClient 没有过时,这是由于文档中的错误造成的。 请参阅问题here

    【讨论】:

      猜你喜欢
      • 2015-02-26
      • 2016-01-29
      • 2016-08-12
      • 1970-01-01
      • 2021-07-30
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多