写点什么

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:003447
用户头像

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

关注

评论

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

数牍科技亮相上海 AI 基金“AI 驱动企业转型” 应用场景战略合作仪式,隐私计算拓展AI应用疆域

详解 nebula 2.0 性能测试和 nebula-importer 数据导入调优

NebulaGraph

数据库 开源 图数据库

鸿蒙轻内核源码分析:掌握信号量使用差异

华为云开发者联盟

鸿蒙 数据结构 信号量 结构体 OpenHarmony

filecoin矿工的收益有哪些?

fil fil收益 ipfs挖矿

Takin Talks·上海 |开源后首场主题研讨会来了,一起解密Takin技术吧!

TakinTalks稳定性社区

揪出那个无主键的表

Simon

MySQL 主键

我写什么,你们决定

喵叔

PHA项目挖矿平台系统开发App

获客I3O6O643Z97

挖矿矿池系统开发案例 PHA矿机挖矿 PHA质押挖矿

有哪些好用的团队文档和技术资料管理的工具?

万事ONES

在线文档 ONES 协同办公

云图说|ASM灰度发布,让服务发布变得更敏捷、更安全

华为云开发者联盟

灰度发布 application 云图说 应用服务网格服务 Service Mesh (ASM)

DOGT狗狗通证软件系统开发公司

智能猫量化机器人炒币系统开发【专业定制、现成源码】

获客I3O6O643Z97

DAPP智能合约交易系统开发 量化策略 量化跟单 量化交易源码

全面解读自动驾驶数据存储关键

焱融科技

人工智能 自动驾驶 云计算 高性能 文件存储

铂金10:能工巧匠-ThreadLocal如何为线程打造私有数据空间

MetaThoughts

Java 后端 多线程 并发

一文看懂filecoin挖矿的成本到底有哪些?

IPFS fil成本 fil挖矿

前端智能化 or 低代码,也许不是个选择题

清秋

大前端 低代码 智能化

互联网产品经理之需求的一生

路边水果摊

产品经理

英特尔中国研究院宋继强:AI技术已成为推动数字化转型的超级力量|WAIC 2021

E科讯

淘悠优软件系统开发内容

目前有哪些好用的用例管理工具?

万事ONES

测试用例 ONES 测试管理

由浅入深C A S

程序猿阿星

CAS 自旋锁

【LeetCode】 H 指数 IIJava题解

Albert

算法 LeetCode 7月日更

有哪些适合大型系统的项目开发管理工具?

万事ONES

项目管理 研发管理 ONES

细说.NET 缓存

喵叔

7月日更

玩转Spring Boot Actuator集成,基操,勿六

白亦杨

Java

台达DOP-100系列触摸屏(LUA程序编写用户管理应用)

林建

lua 台达 触摸屏 用户管理 DOP-100

10万QPS,K6、Gatling和FunTester对比测试

FunTester

性能测试 接口测试 测试框架 压力测试 测试开发

免费分享Spring与SpringMVC开发的优秀图书

Java入门到架构

Java spring Java书籍推荐

NNB牛气冲天系统软件开发搭建

Go 学习笔记之 函数

架构精进之路

Go 语言 7月日更

从装大象中我们学会了什么设计模式

skow

Java 面试 后端 设计模式

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