写点什么

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

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

关注

评论

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

征文投稿丨使用云服务器ECS快速搭建halo博客

阿里云弹性计算

征文投稿 玩转ECS halo博客

巧用这几种文本检索工具,节省80%的时间!

优麒麟

Linux 操作系统 grep 检索 优麒麟

元宇宙的本质特征是五大融合

CECBC

2022年1月云主机性能评测报告,移动云升至第三

博睿数据

浅谈OKR(12/100)

hackstoic

OKR

Web Components系列(四) —— 认识 Shadow DOM

编程三昧

前端 组件化 HTML5, CSS3 2月月更

基于RestTemplate的在线武器库

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

阿里云服务器搭建halo博客从0到1

乌龟哥哥

阿里云 2月月更 halo博客

从小样本学习出发,奔向星辰大海

百度大脑

springcloud五大核心组件

编程江湖

我与Android的故事|社区征文

Changing Lin

android 移动开发 新春征文

欧拉的奇异之旅·风暴来临与欧拉初诞

白洞计划

元宇宙里办年会,听演讲、看产品、抽大奖一件不落

Meta 小元

数字孪生 元宇宙

[JAVA冷知识]什么是逆变(contravariant)与协变(covariant)?数组支持协变&逆变吗?泛型呢?

山河已无恙

Java 2月月更

一文让你彻底搞懂Python中__str__和__repr__

宇宙之一粟

Python 2月月更

设计模式【14】-- 从智能音箱中学习命令模式

秦怀杂货店

Java 设计模式

Hango Rider:网易数帆开源 Envoy 企业级自定义扩展框架

网易数帆

开源 云原生 envoy Hango Rider

2022-02微软漏洞通告

火绒安全

微软 网络安全 终端安全 漏洞修复

亚信科技AISWare AntDB数据库在运营商核心业务系统的联合实践分享

亚信AntDB数据库

5G AntDB intel 亚信科技

声网AI降噪测评系统初探

RTE开发者社区

音视频 RTE 技术详解

Java自定义DNS解析器负载均衡实现

FunTester

负载均衡 性能测试 接口测试 DNS FunTester

redis 面试总结

yuexin_tech

redis 面试

【安全漏洞】浅谈Bypass Waf (基础-实战)

H

网络安全 渗透测试 漏洞

Linux修改drop_caches内核参数来清理缓存的一些笔记

山河已无恙

Linux 2月月更

5种阿里常用代码检测推荐 | 阿里巴巴DevOps实践指南

阿里云云效

阿里云 云原生 软件开发 研发 DevOps实践指南

语义级代码克隆检测数据集的评估与改进

华为云开发者联盟

软件工程 代码克隆检测 代码克隆 语义代码克隆 BigCloneBench

2022年的元宇宙,你该知晓些什么?

CECBC

虚拟空间引领 数字化转型拉开银行差距

CECBC

PingCode Wiki 权限设计之ACL

PingCode研发中心

项目管理 开发 acl PingCode 页面权限

总结 XSS 与 CSRF 两种跨站攻击

喀拉峻

网络安全

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