阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

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

关注

评论

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

苏光牛:坚持产品能力的升级,做金融数字化的坚实数据底座

YG科技

2023-06-27:redis中什么是缓存雪崩?该如何解决?

福大大架构师每日一题

Redis 7 福大大架构师每日一题

停机不收费!华为云RDS for MySQL降本有奇招

轶天下事

Redis跳跃表是如何添加元素的?

王磊

java面试

共筑数字化未来 金山办公携手华为云完成文档中心和GaussDB适配

YG科技

悟道·天鹰 Aquila + 天秤 FlagEval,打造大模型能力与评测标准双标杆

硬科技星球

「悟道·视界」视觉大模型系列,6项领先成果技术详解

硬科技星球

[Paddle] ERNIE-UIE 通用信息抽取模型(含自定义细分领域模型训练)

alexgaoyh

paddle 文心 ERNIE 数据标注 ernie-uie doccano

一文弄懂 OceanBase 用户管理和访问控制

爱可生开源社区

MySQL oceanbase

“云创未来,共享生态”——支付宝小程序云产品发布会,报名开启!

TRaaS

小程序

鲸鸿动能对话汽车之家,全链路营销助力新增长

最新动态

赋能政企深度用云,华为云数据库大咖有话说

YG科技

分布式机器学习(Parameter Server)

这我可不懂

机器学习 分布式

【精彩回顾】华为云亮相2023开放原子全球开源峰会

华为云开源

#云原生 #开源

数智底座必备能力之轻松驾驭新技术

用友BIP

数智底座 Pass平台

路径万千,华为云数据库选择珠峰北坡登顶,给世界一个更优选择

YG科技

inBuilder今日分享丨RPM包制作入门

inBuilder低代码平台

宝兰德应用服务器软件与华为云GaussDB完成兼容互认证

YG科技

“息壤”引领首个算力互联互通验证平台建设,天翼云开启算力互联网新纪元!

天翼云开发者社区

人工智能 云计算

MacOS专业截屏指南——截屏技巧和截屏工具分享

互联网工科生

macos mac截图工具

谷歌正研发“人类最强大模型”!开启智能模型的新纪元:探索迭代发展和低代码开发平台的无限可能

不在线第一只蜗牛

低代码 谷歌 人工智能模型 ChatGPT

瓴羊Quick BI数据门户,让企业数据管理一目了然

巷子

从新手游上线看游戏数据库选型

YG科技

AI赋能文明的发展,就看低代码了吗?

EquatorCoco

低代码 AI赋能

海量数据运维要给力,华为云GaussDB(for Cassandra)来助力

YG科技

go语言中如何实现同步操作呢

高端章鱼哥

Go 语言

解析数字信息时代下的信息安全挑战:大道至简——JNPF快速开发平台的低代码之光

快乐非自愿限量之名

低代码 信息安全 企业数字化 低代码数字转型

即时通讯系统为什么选择GaussDB(for Redis)?

YG科技

全量通过!华为云GaussDB首批完成信通院全密态数据库评测

YG科技

挑选最佳美国主机,让你的网站飞跃

一只扑棱蛾子

美国主机

深耕数据库根技术,华为云云原生数据库推动汽车产业数智升级

轶天下事

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