Asp.Net Core采用MailKit部署到Linux Docker连接邮件服务器报错
前段时间看文章了解到发邮件的SmtpClient已经过时了,微软官方推荐大家用其他解决方案,例如MailKit。
https://docs.microsoft.com/zh-cn/dotnet/api/system.net.mail.smtpclient?view=netcore-2.2
SmtpClient Class
定义
命名空间:
System.Net.Mail
Assemblies:
System.dll, netstandard.dll, System.Net.Mail.dll
警告
此 API 现已过时。
允许应用程序使用简单邮件传输协议 (SMTP) 来发送电子邮件。
C#
复制
[System.Obsolete("SmtpClient and its network of types are poorly designed, we strongly recommend you use https://github.com/jstedfast/MailKit and https://github.com/jstedfast/MimeKit instead")]
public class SmtpClient : IDisposable
关于MailKit的使用,网上大把,轻而易举就搞定了,本机调试没问题,但是把服务端软件发布到Linux Docker运行,报错了
An error occurred while attempting to establish an SSL or TLS connection. One possibility is that you are trying to connect to a port which does not support SSL/TLS. The other possibility is that the SSL certificate presented by the server is not trusted by the system for one or more of the following reasons: 1. The server is using a self-signed certificate which cannot be verified. 2. The local system is missing a Root or Intermediate certificate needed to verify the server's certificate. 3. The certificate presented by the server is expired or invalid. See https://github.com/jstedfast/MailKit/blob/master/FAQ.md#InvalidSslCertificate for possible solutions. at MailKit.Net.Smtp.SmtpClient.ConnectAsync(String host, Int32 port, SecureSocketOptions options, Boolean doAsync, CancellationToken cancellationToken)
报错信息里有一个连接,
https://github.com/jstedfast/MailKit/blob/master/FAQ.md#InvalidSslCertificate
查看介绍,已经按照要求去做了。
我用的是腾讯企业邮箱,Asp.Net Core服务器部署在阿里云,开始还以为两家的服务器不相容,后来发现在VMWare安装的CentOS虚拟机上测试同样报错,确定是Linux环境下的问题。于是开启百度模式,网上有很多说法,主要有几大类:
一,把client.ConnectAsync(“smtp.exmail.qq.com”, 465, SecureSocketOptions.Auto)连接邮件服务器的参数换一下
我把SecureSocketOptions的所有选项都换了一遍,都报错。
二,把连接邮件服务器端口从465改为587
改了仍然报错。
三,把帐号密码改为客户端专用密码
这个其实要先用微信绑定邮箱,然后,以前的登录密码作废了,需要使用客户端专用密码,不然连Foxmail客户端都无法收邮件了。但是我用了客户端专用密码,还是报错。
在stackoverflow上面看到有人遇到了同样的问题。
https://stackoverflow.com/questions/55013298/cryptographicexception-exception-when-setting-up-ssl-handshake-with-mailkit-usin
但是没有解决方案!作者把问题提交给微软了。
这么简单的一个功能,居然还有这么大的一个坑!真是蛋疼……
走投无路之际,到作者提交的这个问题下面看一看,
https://github.com/Microsoft/dotnet/issues/973
居然有一个湖南的同学也在说遇到了这个问题,怎么办?
作者的答复是:No - sorry we haven't solved this. We worked around this by disabling the revocation check (property on the Malkit client).
突然看到了一线希望!可以禁用一个什么鬼属性,把这个问题绕过去。
在SmtpClient的属性里翻了一下,恩,应该就是它了,
client.CheckCertificateRevocation = false;
设置为false,测试一下,真的可以发邮件了!最后代码长这样
using (var client = new SmtpClient())
{
client.CheckCertificateRevocation = false; // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
client.ServerCertificateValidationCallback = (s, c, h, e) => true; await client.ConnectAsync(“smtp.exmail.qq.com”, 465, SecureSocketOptions.Auto); // Note: only needed if the SMTP server requires authentication
//如果腾讯企业邮箱绑定了微信,需要把密码改为客户端专用密码
await client.AuthenticateAsync(Username, Password); await client.SendAsync(message); await client.DisconnectAsync(true);
}
顺带说一下,采用SecureSocketOptions.Auto参数,如果连接465端口,自动转换为SslOnConnect,如果连接587端口,自动转换为StartTlsWhenAvailable
Asp.Net Core采用MailKit部署到Linux Docker连接邮件服务器报错的更多相关文章
- Asp.Net Core 发布和部署(Linux + Jexus )
前言 在上篇文章中,主要介绍了 Dotnet Core Run 命令,这篇文章主要是讲解如何在 asp.net core 中对我们的已经完成的程序进行发布和部署. 有关如何使用 Nginx 进行部署, ...
- 翻译 - ASP.NET Core 托管和部署 - 在 Linux 上使用 Nginx 托管 ASP.NET Core 网站
翻译自 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-5.0 本文介 ...
- VisualStudioCode创建的asp.net core控制台程序部署到linux
1.asp.net core控制台程序 static void Main(string[] args) { ; ) { Console.WriteLine("Hello World!&quo ...
- asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
asp.net core程序部署在centos7(下面的解决方案,其他系统都能使用,这里只是我自己部署在centos7),使用服务器jexus进行部署,AppHost模式. 因为请求是由jexus进行 ...
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)
最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(2)
第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 为Domain Model添加约束 前一部分, 我们已经把数据库创建出来了. 那么我们先看看这个数据库 ...
- 把Asp.Net Core 2.0部署在Linux上,使用Nginx代理服务器,并且用Systemctl命令以服务的方式监听项目
在Linux上部署.net core 2.0程序: 第一步:配置Nginx代理 在/etc/nginx/sites-available/default 中添加 server { listen ; lo ...
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(3)
第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.html 由于 ...
- ASP.NET Core托管和部署Linux实操演练手册
一.课程介绍 ASP.NET Core 是一种全新的跨平台开源 .NET 框架,能够在 IIS.Nginx.Apache.Docker 上进行托管或在自己的进程中进行自托管. 作为一个.NET Web ...
随机推荐
- 【已解决】git的一些常用命令
git:分布式的版本管理系统,一般的开发模式: 如果是开发人员,忽略此步骤,从下面大字的开始即可: 项目开始阶段,初始化项目(init),提交本地的代码到仓库,将本地仓库的代码推送到远端库(push) ...
- win10无法在桌面右键快捷打开个性化设置、显示设置,在任务栏右键无法快捷打开任务栏设置
Win+R,输入regedit,定位到HKEY_CURRENT_USER\Software\Classes\ 找到列表中的ms-settings 将其删除即可解决! 转自百度知道
- Skyshop.代码解析
MarmosetInput.cginc: Input结构定义: struct Input { #if defined(MARMO_PACKED_UV) || defined(MARMO_PACKED_ ...
- requests---session简介
http协议是无状态的,也就是每个请求都是独立的.那么登录后的一系列动作,都需要用cookie来验证身份是否是登录状态,为了高效的管理会话,保持会话,于是就有了session session简介 se ...
- 爬虫---Beautiful Soup 反反爬虫事例
前两章简单的讲了Beautiful Soup的用法,在爬虫的过程中相信都遇到过一些反爬虫,如何跳过这些反爬虫呢?今天通过知乎网写一个简单的反爬中 什么是反爬虫 简单的说就是使用任何技术手段,阻止别人批 ...
- 06webpack-- html-webpack-plugin的2个作用
<!-- 15 html-webpack-plugin的2个作用 下载 cnpm i html-webpack-plugin -D 作用在==>内存中生成页面 在webpack中 导入在内 ...
- ubuntu16.04安装docker图形管理界面portainer
下载镜像 docker pull portainer/portainer 单机版运行 docker run -d --name portainer \ -p 9000:9000 \ --restart ...
- 【Spring IoC】依赖注入DI(四)
平常的Java开发中,程序员在某个类中需要依赖其它类的方法.通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由程 ...
- 处理海量数据的grep、cut、awk、sed 命令
grep.cut.awk.sed 常常应用在查找日志.数据.输出结果等等,并对我们想要的数据进行提取. 通常grep,sed命令是对行进行提取,cut跟awk是对列进行提取 处理海量数据之grep命令 ...
- Tableau 练习题
1.练习一 1. 提出问题:对某个学校或者一个城市的教育水平进行评估,或者多个学校的教育水平进行比较 指标:学生考试成绩 根据考试成绩高低判断教育水平:影响因素:学生餐饮,从多个维度分析,各城市在不同 ...