写点什么

MailKit 正式替换了.NET 的 SmtpClient

  • 2017-04-17
  • 本文字数:1055 字

    阅读完需:约 3 分钟

SmtpClient 的文档现已改成:“废弃(“SmtpClient 及其相关类型设计很差,我们强烈建议使用 https://github.com/jstedfast/MailKit https://github.com/jstedfast/MimeKit 替代。”)”。这是 Microsoft 有史以来第二次将一个.NET 类正式标为被开源软件库替代。

MailKit MimeKit 的创建者是 Jeffrey Stedfast,InfoQ 曾在 2014 年采访过他。在当时,它们已被认为是.NET 上最全面的 MIME 和电子邮件库。

Newtonsoft 的 JSON.NET 是被 Microsoft 接受的首个重要开源库。JSON.NET 已在 ASP.NET Web API 中广泛使用,并被正式推荐为 Web API 使用的序列化类,通常可替代 JavaScriptSerializer 类。但是不同于 SmtpClient 的是,没有任何一个序列化类因此被标记为废弃。

SmtpClient 的主要问题在于连接生命周期管理混乱。由于连接 SMTP 服务器是一个非常耗时的操作,尤其是需要做认证时,因此每个 SmtpClient 对象都维护了一个内部连接池。

这是一个非常奇葩的设计。以典型的数据库连接为例,当在 SqlClient 命名空间中调用 Dispose 方法时,底层的连接会返回到连接池中。当新建一个 SqlClient 时,需要检查连接池中是否已具有连接串相同的活跃连接。

使用 SmtpClient 时,调用 Dispose 方法会关闭所有连接并清空对象的连接池。这意味着不能通过常规的“using”语句调用该方法。

你可能会想到,“那么我可以持续维护一个类似于 HttpClient 的共享实例”。但这也行不通。因为不同于在 HttpClient 中,Send 和 SendAsync 方法并非是线程安全的。除非你引入了自定义的同步模式,否则不能以这种方式使用 SmtpClient。事实上, SmtpClient 的文档中已给出了警告:

SmtpClient 无法判定一个应用何时能完成,何时应被清除。

相比之下, MailKit 的 SMTP 客户端表示的是一个到单个服务器的简单连接。它消除了由内部连接池所导致的复杂性。如果使用 MailKit 连接对象只需创建应用特定的连接池,这的确简化了操作。

虽然活跃的 MailKit 软件缺陷数非常少,但在对异步操作的真正支持上,它的确还存在着问题。要对已有软件库中添加异步操作,一般方法是拷贝全部方法并稍作修改以支持异步操作。在一些简单的应用中,这并非难事。但是对于邮件客户端这样的复杂应用,这会导致一场噩梦。当前MailKit 只是简单地调用了同步代码路径和阻塞线程,模拟了对异步操作的支持。

解决异步问题的方案现在仍未确定,一个正在考虑的方案是使用 AsyncRewriter 工具。它是一个基于 Roslyn 的工具,已被 PostgreSQL 团队用于将其同步代码转换为等价的异步代码。

查看英文原文: MailKit Officially Replaces .NET’s SmtpClient

2017-04-17 19:003280
用户头像

发布了 227 篇内容, 共 81.7 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

详细解读 React useCallback & useMemo

夏天的味道123

前端 React

DataEase 集成 CAS 实现用户单点登录

搞大屏的小北

CAS SSO 单点登录 BI 分析工具 DataEase

软件测试 | UI自动化常用设计模式

测吧(北京)科技有限公司

测试

【干货】Maya学习过程中遇到的困难和解决方法

Finovy Cloud

软件测试 | 简历中应该如何描述才能体现出软技能的实力?

测吧(北京)科技有限公司

测试

软件测试 | 普罗米修斯 - 初识PromQL

测吧(北京)科技有限公司

测试

EMQ广州Office正式启用|在新一站续写开源

EMQ映云科技

开源 物联网 IoT emq 企业号 3 月 PK 榜

灾备是什么意思?怎么简单理解?

行云管家

灾备

你有“ChatGPT综合征”吗:想搞钱,或是失业焦虑?

引迈信息

人工智能 AI ChatGPT

猫咪在逐步壮大--PUSS通证深度解析

股市老人

软件测试 | 普罗米修斯 - HTTP API调用PromQL

测吧(北京)科技有限公司

测试

美团前端二面经典react面试题总结

夏天的味道123

前端 React

滴滴前端二面常考react面试题(持续更新中)

夏天的味道123

前端 React

海泰方圆精彩亮相第六届中国人工智能与大数据海南高峰论坛

电子信息发烧客

社交泛娱乐之外,融云 IM 在商业沟通中的实践

融云 RongCloud

IM 泛娱乐 通讯

低代码如何推动自动化未来

力软低代码开发平台

联合 NVIDIA 完成首批 17 个自动驾驶模型优化

百度开发者中心

人工智能 自动驾驶

自建MQTT迁移IoT物联网平台实战——实践类

阿里云AIoT

监控 物联网 消息中间件 数据格式 网络性能优化

【网易云商】概念解读稳定性保障

网易云信

稳定性 稳定性测试

经常被问到的react-router实现原理详解

夏天的味道123

前端 React

模块7 王者荣耀商城-异地多活架构

KING

软件测试 | UI自动化设计军规

测吧(北京)科技有限公司

测试

软件测试 | UI自动化常用设计模式(二)

测吧(北京)科技有限公司

测试

容器化部署是什么意思?有什么优势?

行云管家

容器化

软件测试 | 跨平台设备管理方案Selenium Grid

测吧(北京)科技有限公司

测试

软件测试 | 普罗米修斯 - PromQL进阶

测吧(北京)科技有限公司

测试

软件测试/测试开发 | 想测试入门就必须要懂的软件开发流程

测试人

软件测试 自动化测试 测试发开

解决方案| anyRTC 融合其他厂商视频会议系统方案

anyRTC开发者

音视频 私有云 视频会议 视频通话 H.323

软件测试| 普罗米修斯 - 基本使用

测吧(北京)科技有限公司

测试

软件测试 | 普罗米修斯 - 自定义exporter

测吧(北京)科技有限公司

测试

软件测试 | UI自动化中的分层设计

测吧(北京)科技有限公司

测试

MailKit正式替换了.NET的SmtpClient_.NET_Jonathan Allen_InfoQ精选文章