BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

MailKit正式替换了.NET的SmtpClient

| 作者 Jonathan Allen 关注 530 他的粉丝 ,译者 Rays 关注 3 他的粉丝 发布于 2017年4月18日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

SmtpClient的文档现已改成:“废弃(“SmtpClient及其相关类型设计很差,我们强烈建议使用https://github.com/jstedfast/MailKithttps://github.com/jstedfast/MimeKit替代。”)”。这是Microsoft有史以来第二次将一个.NET类正式标为被开源软件库替代。

MailKitMimeKit的创建者是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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT