.net core 发送邮件 本地OK,部署到 阿里云后报错---填坑
项目使用 Masuit.Tools中的发送邮件功能,工具默认使用的System.Net.Mail.SmtpClient
SmtpServer = "smtp.xxxxx.com",// SMTP服务器 SmtpPort = 25, // SMTP服务器端口 EnableSsl = false,//使用SSL
本地测试ok,阿里云一直报错,后来找到问题——25端口被阿里云禁用,不能被开启,工单告诉我尝试用465 端口采用SSL加密方式发送邮件。
于是修改代码如下,但是本地却又报错,System.Net.Mail.SmtpException: Failure sending mail
SmtpServer = "smtp.xxxxx.com",// SMTP服务器 SmtpPort = 465, // SMTP服务器端口 EnableSsl = true,//使用SSL
终于百度到一篇文章,https://blog.csdn.net/ken_io/article/details/104762653
这个问题跟SSL/TLS的协议版本有关系,SSL演化到3.0之后还是不够安全,因此又出现了SSL的升级版TLS协议,由于建立连接时的区别又分别被称为显示SSL和隐式SSL。SSL/TLS协议通常是结对出现SSL/TLS,不过大家还是喜欢简称为SSL。
目前最新版本是TLS 1.3,其他可用版本是TLS 1.2和TLS 1.1,其中TLS1.1计划于2020年弃用
所以,目前主流的邮箱服务商加密协议使用的都是TLS。
但是System.Net.Mail.SmtpClient不支持较新的TLS协议,具体的TLS协议版本支持情况MSDN上并未找到相关说明截止到2020年3月受影响的框架版本:
- .NET Core 2.0-3.1
- .NET Framework 2.0-4.8
目前微软MSDN已经将
System.Net.Mail.SmtpClient标记为已过期(obsolete),但源码中并未标记,也并未给出替代实现。
最终使用了MailKit 组件解决问题
MailKit是一个开源的基于MimeKit的跨平台邮件收发类库,支持IMAP、POP3、SMTP。其中SmtpClient也支持TLS协议.
可以很好的支持 .NET Core以及 .NET Framework框架的邮件发送
安装Nuget Package
#.NET Core dotnet add package MailKit --version 2.5.1 #.NET Framework Install-Package MailKit -Version 2.5.1
示例代码:
using System; using MailKit.Net.Smtp; using MailKit; using MimeKit; namespace Ken.IO.Util { class Program { public static void Main (string[] args) { var message = new MimeMessage (); message.From.Add (new MailboxAddress ("test", "xxx@qq.com")); message.To.Add (new MailboxAddress ("test", "xxx@163.com")); message.Subject = "邮件测试"; //html or plain var bodyBuilder = new BodyBuilder (); bodyBuilder.HtmlBody = "<b>邮件测试html正文ken.io</b>"; bodyBuilder.TextBody = "邮件测试文本正文ken.io"; message.Body = bodyBuilder.ToMessageBody(); using (var client = new SmtpClient ()) { client.ServerCertificateValidationCallback = (s,c,h,e) => true; //smtp服务器,端口,是否开启ssl client.Connect ("smtp.qq.com", 465, true); client.Authenticate ("xxx@qq.com", "password"); client.Send (message); client.Disconnect (true); } } } }

浙公网安备 33010602011771号