MailKit填坑记——.NET Core邮件服务

时间:2019-09-04 10:01   作者:ChenReal    阅读:273

背景

在微软爸爸的推动下近年.NET Core着实大热。去年开始,我们公司也跟风将新的项目逐步转到.NET Core上。项目上很多组件也跟因应.NET Core的特性和大众的口碑进行了替换和重写。其中就有邮件服务的组件(Mail)。

.NET Framework v2.0的时代的产物System.Net.Mail听说已经被淘汰了,替代品是MailKit MimeKit 。于是,一阵copy & paste,新的Mail组件变封装好了。在Windows下UnitTest了一回。嗯,没问题,Passed! 最近,开发一个分布式的错误日志采集工具,错误警报使用邮件发送出去。因此,早前封装的Mail组件便有了用武之地。

坑:LINUX不Work了。

同样的代码,在Windows下怎么发都可以,怎么到了Linux就不行呢?说好的话平台,怎么就……

扒开错误日志一看,MailKit的报错信息很有意思!直接在报错信息中,告知了解决方案,并且很贴心的提供了FAQ的链接地址:

https://github.com/jstedfast/MailKit/blob/master/FAQ.md#InvalidSslCertificate

读玩方才恍然大悟。我原来我用的网易企业邮箱采用的SSL端口是994,并不在MailKit所支持的端口范围内。

Below is a table of the protocols supported by MailKit and the standard plain-text ports (which either do not support any SSL/TLS encryption at all or only via the STARTTLS command extension) and the SSL ports which require SSL/TLS encryption immediately upon a successful connection to the remote host.

|Protocol|Standard Port|SSL Port| |--|--|--| |SMTP|25 or 587|465| |POP3|110|995| |IMAP|143|993|

看到这里只能暗骂一声,三石哥没事搞啥非主流!然后转身回去改代码,把端口改成25。另外,Connect方法还要带SecureSocketOptions.StartTls的参数,这一点很重要。

...
await client.ConnectAsync(mailInfo.Host, mailInfo.Port, SecureSocketOptions.SslOnConnect);
await client.AuthenticateAsync(mailInfo.UserAddress, mailInfo.Password);
await client.SendAsync(message);
await client.DisconnectAsync(true);
...

Linux虚拟机上运行,这回终于也没毛病了~

然而,等我部署到生产机后,邮件又不Work了!直接来了个timeout的报错。搜索了一番资料再加上个人推算出,得出的结论是 阿里云的服务器把25端口给禁用了。 好吧,至此,我跟网易邮箱缘尽了!换成腾讯邮箱,开启SSL的465端口发送SMTP邮件,Successfully!

 

评论
0/200