写点什么

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

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

关注

评论

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

TTS走向拟人化时代:数据堂高质量语音资源全面支撑模型升级

数据堂

人工智能 数据 语音合成 语言模型 语音数据

豆包大模型1.6发布!更强模型、更高性价比

新消费日报

【HarmonyOS5】DevEco Studio 使用指南:代码阅读与编辑功能详解

颜颜yan_

HarmonyOS DevEco Studio Harmony5

这几道Java集合框架面试题在面试中几乎必问

Geek_Yin

Java 程序员 java面试 Java面试题

2025校招/社招Java八股文面试题库,横扫大厂后端岗

Geek_Yin

Java 程序员 java面试 Java面试题

超实用!手把手教你Dify版本升级

王磊

四维图新与阿里云达成战略合作,联合打造汽车行业一揽子解决方案

科技汇

技术解读:国内外RPA产品技术特点及财务应用实现

Techinsight

RPA RPAxAI RPA Agent

现代财务——智能技术背景下的企业变革

智达方通

全面预算管理 财务管理

HPE SPP 2025.05.00.00 - HPE 服务器固件、驱动程序和系统软件包

sysin

SPP

去中心化交易所(DEX)架构:智能合约驱动与AMM算法创新

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

中心化交易所(CEX)架构:高并发撮合引擎与合规安全体系

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 代币开发 代币开发公链开发

使用DevEcoStudio 开发、编译鸿蒙 NEXT_APP 以及使用中文插件

飞龙AI

DevEco Studio HarmonyOS NEXT

Java集合必会14问(精选面试题整理)

Geek_Yin

Java 程序员 java面试 Java面试题

聚焦科学智能|第412期双清论坛“AI for Science:战略与行动”在京召开

ModelWhale

科学智能 AI4S

当AI学会"看图说话":人类专家如何为视频描述生成器把关?

澳鹏Appen

AI 视频处理

24届软件开发-华为OD面经(Java开发岗)!

程序员高级码农

Java 程序员 面试

币币/合约交易所架构:多资产支持与风控体系设计

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

真金白银扶持新质商家,拼多多在为下一个十年布局

Alter

让通义灵码越用越懂你?使用记忆功能,打造你的专属编程搭档

阿里巴巴云原生

让通义灵码越用越懂你?使用记忆功能,打造你的专属编程搭档

阿里云云效

通义灵码

什么是低代码(Low Code)?低代码平台的组成要素包含有哪些?

优秀

低代码 低代码开发 低代码平台

感谢艾瑞白皮书“点名”,但网易的挖掘机器人真不是“打游戏送的”

网易伏羲

数字孪生 人机协作 网易伏羲 工程机械

Traefik 可观测性最佳实践

观测云

Traefik

阿里云可观测 2025 年 5 月产品动态

阿里巴巴云原生

飞书多维表格利用 Amazon Bedrock AI 能力赋能业务

亚马逊云科技 (Amazon Web Services)

从 AI Agent 到模型推理:端到端 AI 可观测实践

阿里巴巴云原生

2025 必知!市面上那些超好用的 AI Agent,你用过几个?

Techinsight

AI+ AI 图像生成 +AI

IPv6检测指标中的IPv6授权体系是什么意思?(国科云)

国科云

梁汝波:字节跳动要以持续智能突破,坚定服务产业应用

新消费日报

中东AI迷雾里的中美棋局

脑极体

AI

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