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

背景

在微软爸爸的推动下近年.NET Core着实大热。去年开始,我们公司也跟风将新的项目逐步转到.NET Core上。项目上很多组件也跟因应.NET Core的特性和大面积进行了替换和重写。其中就有邮件服务的组件(Mail)。
.NET Framework v2.0的时代的产物System.Net.Mail听说已经被淘汰了,替代品是MailKitMimeKit。于是,一阵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!

你可能感兴趣的:(MailKit填坑记——.NET Core邮件服务)