AICon议程上新60%,阿里国际、360智脑、科大讯飞、蔚来汽车分享大模型探索与实践 了解详情
写点什么

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

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

关注

评论

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

2.基于Label studio的训练数据标注指南:(智能文档)文档抽取任务、PDF、表格、图片抽取标注等

汀丶人工智能

自然语言处理 数据标注

架构误区系列14:纯代码视角的复用

agnostic

复用

在文心一言出生地,百度悄悄燃烧AI小宇宙

脑极体

百度 文心一言

架构实战营 - 模块四作业

🐢先生

架构实战营

Databend v1.0 Release 正式发布

Databend

Spring Boot 整合流程引擎 Flowable,so easy

做梦都在改BUG

Java Spring Boot 流程引擎 flowable

kafka是怎么做到基于磁盘却比内存还快的?

做梦都在改BUG

kafka 内存 磁盘

What's new in dubbo-go-pixiu v0.6.0

apache/dubbo-go

dubbo dubbo-go dubbogo

什么是数字产品?

涛哥 数字产品和业务架构

数字化转型 数字产品

DawnSql在数据治理中的优势

陈飞

微服务架构 分布式数据库 架构设计 数据治理 分布式缓存

爱不释手!阿里十几位大牛联玦整理—23年最全面试八股文合集

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

手把手教你使用 Python 调用 ChatGPT-3.5-API

老表

Python GPT-3 ChatGPT

从理论到实践:MySQL性能优化和高可用架构,一次讲清

做梦都在改BUG

Java MySQL 数据库 面试 性能优化

架构误区系列15:生造的业务概念

agnostic

服务设计

Nautilus Chain即将上线,一文盘点其六大优势

威廉META

新增 – 使用基于用户的许可证模式在 Amazon EC2 上运行 Visual Studio 软件

亚马逊云科技 (Amazon Web Services)

构建微服务的基建——事件总线

为自己带盐

RabbitMQ CAP 事件总线

一文彻底弄清楚分布式锁

做梦都在改BUG

Java 分布式锁

数据库“啃”不动?CnosDB带你轻松阅读十万行源码!

CnosDB

IoT 时序数据库 开源社区 CnosDB

从ChatGPT到AIGC,是一次技术革命也是一次创业浪潮 | 社区征文

打工人!

人工智能 AIGC AI绘画 ChatGPT New Bing

一座海上营业厅,一个女孩独自守望的十九年

脑极体

5G 智慧农业

FL Studio21.0.0水果中文版发布更新下载

茶色酒

FL Studio21.0.0

Adapter基础讲解

梦笔生花

mvc Adapter arrayadapter

写给 go 开发者的 gRPC 教程 - 错误处理

凉凉的知识库

Go 微服务 gRPC RPC RPC框架

Camtasia2023最新版下载使用教程

茶色酒

Camtasia2023

Matlab实现彩色图像的转换 平滑 锐化与分割

timerring

数字图像处理

大专毕业,0基础转行C++程序员一个月后,我后悔了

程序员晚枫

程序员 转行 C++ STL

为什么 MyBatis 源码中,没有我那种 if···else

程序知音

Nautilus Chain即将上线,一文盘点其六大优势

西柚子

mysql锁及数据一致性总结

阿呆

MySQL innodb 数据一致性 事务/行级锁 脏读

【git】将本地代码推送到远程git仓库

石臻臻的杂货铺

git

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