.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);
            }
        }
    }
}

 

 

 

posted @ 2020-10-15 22:33  zzh82322  阅读(607)  评论(0)    收藏  举报