前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >System.Net.Mail.SmtpClient通过SSL/TLS协议发送邮件失败问题解决

System.Net.Mail.SmtpClient通过SSL/TLS协议发送邮件失败问题解决

作者头像
KenTalk
发布于 2020-03-05 12:24:01
发布于 2020-03-05 12:24:01
1.7K00
代码可运行
举报
文章被收录于专栏:Ken的杂谈Ken的杂谈
运行总次数:0
代码可运行

一、问题描述

1、问题现象

通过System.Net.Mail使用SSL协议发送邮件失败并报错 System.Net.Mail.SmtpException: Failure sending mail

详细报错信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
System.Net.Mail.SmtpException: Failure sending mail.
 ---> System.IO.IOException: Unable to read data from the transport connection: The connection was closed.
   at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)
   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpClient.GetConnection()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)

2、问题原因

这个问题跟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),但源码中并未标记,也并未给出替代实现。

二、解决办法

1、使用System.Web.Mail

System.Web.Mail.SmtpMail虽然已被标记为已过期,但是毕竟他支持新的SSL/TLS协议。

不过,需要注意的是,System.Web.Mail.SmtpMail,只适用于 .NET Framework(>=2.0)

示例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System.Web.Mail;
using System;

namespace Ken.IO.Util {

    class Program
    {
        public static void Main (string[] args)
        {
            MailMessage mmsg = new MailMessage();
            mmsg.Subject = "邮件测试主题ken.io";
            mmsg.BodyFormat = MailFormat.Html;
            mmsg.Body = "邮件测试正文ken.io";
            mmsg.BodyEncoding = Encoding.UTF8;
            //优先级
            mmsg.Priority = MailPriority.High;
            //发件者邮箱地址
            mmsg.From = "xxx@qq.com";
            //收件人收箱地址
            mmsg.To = "xxx@163.com";
            mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
            //用户名
            mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", mmsg.From);
            //密码
            mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "password");
            //端口 
            mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 465);
            //使用SSL 
            mmsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
            //Smtp服务器
            SmtpMail.SmtpServer = "smtp.qq.com";
            SmtpMail.Send(mmsg);
        }
    }
}

2、使用MailKit

MailKit是一个开源的基于MimeKit的跨平台邮件收发类库,支持IMAP、POP3、SMTP。其中SmtpClient也支持TLS协议.

可以很好的支持 .NET Core以及 .NET Framework框架的邮件发送

安装Nuget Package

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#.NET Core
dotnet add package MailKit --version 2.5.1

#.NET Framework
Install-Package MailKit -Version 2.5.1

示例代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
            }
        }
    }
}

三、备注

1、附录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MYSQL自动备份并发送邮件工具
最近在开发小程序,由于服务器只有一台,所以不能数据库异机备份,出于数据安全的考虑,就做了一个数据库定时备份并发送邮件到自己的邮箱的小工具,先看下工具界面
code2roc
2023/07/19
2980
MYSQL自动备份并发送邮件工具
使用SSL加密465端口发送邮件
因云虚拟主机的25端口默认封闭,需要使用SSL加密端口(通常是465端口)来对外进行发送邮件。本文通过提供.NET、PHP和ASP样例来介绍使用SSL加密端口发送邮件的方法,其他语言的实现思路与本文介绍的方法基本相同。
佛系豪豪吖
2023/02/23
3K0
ASP和ASP.NET发送邮件笔记
    这两天因公司网站邮件发不出去,然后研究了在asp网站发送邮件和在asp.net网站发送邮件的代码,把碰到的问题这里记录一下。
tandaxia
2018/09/27
7.4K0
ASP和ASP.NET发送邮件笔记
今天给大家带来我的网站发送465端口邮件的代码,带html样式哦
今天给大家分享,在服务器上面发送邮件 服务器默认禁用了25端口,查阅了一些资料,说是得用465端口 于是就百度百度在百度,完成了通过465端口发送html样式的代码 其实很简单 我也是为了记录 怕以后
Shunnet
2021/06/11
8010
今天给大家带来我的网站发送465端口邮件的代码,带html样式哦
c# 发送Email的2中方式
我相信大多数人发送邮件使用第二种,但是有时候第二种方式是发不出去的,那么什么情况发布出去呢???
冰封一夏
2019/09/11
5270
使用 MimeKit 和 MailKit 发送邮件
MimeKit 给.NET 社区带来了一流的 MIME 解析器,它能处理复杂的各种Mime, 性能好。而且开箱即用支持 S/MIME 和 PGP。MimeKit 和 MailKit 支持最新的国际化的电子邮件标准,是.NET 中为一个支持完整支持这些标准电子邮件库,最近正式发布了1.0版本。如果你想做所有与的电子邮件相关的事情,看看 MimeKit 和 MailKit。我保证你不会失望,它支持.NET/Mono的所有平台,包括移动电话、平板等。 使用方法很简单和.NET的SmtpClient 差不多,不过比
张善友
2018/01/29
2.2K0
ASP.NET(C#) 发送邮件帮助类Mailhelper
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; u
KenTalk
2018/09/11
1.4K0
使用System.Net.Mail通过gmail发送电子邮件
gmail的smtp采用了ssl连接:      Outgoing Mail (SMTP) Server - requires TLS: smtp.gmail.com (use authentication)      Use Authentication: Yes      Use STARTTLS: Yes (some clients call this SSL)      Port: 465 or 587 知道了gmail的发信细节,用System.Net.Mail,就是下面这段代码就可以了 usi
张善友
2018/01/19
1.8K0
.NET Core 使用MailKit发送电子邮件
发送邮件通知的功能在各种系统里都很常见。我的博客也能在有新评论、新回复,或者文章被其他网站引用时向管理员发送邮件。那么在.NET Core里,如何实现发送电子邮件呢?
Edi Wang
2019/07/08
6K0
.NET Core 使用MailKit发送电子邮件
在Managed Code通过Google Gmail发送邮件以及如何通过Outlook配置Gmail
在项目开发中,发送邮件时一种非常常见的功能。一般的情况下,大型的公司都有自己的邮件系统,我们可以直接通过公司的Pop/SMTP Server进行邮件的发送和接收。不过,对于一些小公司不具有这样的条件,他们一般通过一些公共的邮件服务通过商提供的邮件服务。比如Sina,163就是很好的、常用的邮件服务。不过相比之下,我还是习惯使用Google Gmail。 接下来,我将介绍两方面来介绍今天的内容,如果通过Managed code通过Gmail进行邮件的发送,以及如何在Outlook中配置Gmail。今天介绍的东
蒋金楠
2018/02/07
1.7K0
在Managed Code通过Google Gmail发送邮件以及如何通过Outlook配置Gmail
关于.NET邮件的收发问题总结
        最近因为项目需要,研究了一下邮件的发送和接收,发现现在这方面的问题很多.虽然网上这方面的资料很多,但是真正应用起来 仍然会发现不少问题,而且很多人都抱怨书上或者网上的一些代码应用起来是失败的,并且针对附件方面的处理不太完善,针对这种情况我把最近研究所得做一个小小的总结,希望能对大家有所帮助。         首先来谈谈发送邮件的问题。
跟着阿笨一起玩NET
2018/09/19
7790
ASP.Net 2.0 发送邮件的代码
这两天因为要做一个可以收集用户提交信息,然后发送邮件到指定邮箱的网页。在asp.net2.0里网络
Java架构师必看
2021/03/22
1.9K0
ASP.NET 实现发送邮件 + 多个收件人 + 多个附件
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/42011431
DannyHoo
2018/09/13
2K0
ASP.NET 实现发送邮件 + 多个收件人 + 多个附件
使用.NET发送邮件
出自:http://blog.csdn.net/ycl111/如果你曾经使用过ASP来发送邮件,你大C#
Java架构师必看
2021/03/22
9100
c#发送邮件含附件
在网上巴拉巴拉找个的,然后修改了下,测试可用 using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; using System.Net.Mime; using System.Net; namespace CustomerDetails { public class SendEmail { private MailMessage mailMessage;
冰封一夏
2019/09/10
1.1K0
MailKit: 在 .NET 中实现高效电子邮件发送与接收
在现代应用程序中,电子邮件仍然是重要的通讯方式之一。无论是个人应用程序还是企业级系统,邮件发送和接收功能都经常是必不可少的。
郑子铭
2025/04/02
770
MailKit: 在 .NET 中实现高效电子邮件发送与接收
Unity 如何在程序中发送Email邮件
发送邮件需要用到System.Net.Mail命名空间下的MailMessage和SmtpClient类,smtp是一种提供可靠且有效的电子邮件传输协议,是建立在FTP文件传输服务上的一种邮件服务。下面封装一个Email类,声明MailMessage和SmtpClient字段:
CoderZ
2022/08/29
9730
Unity 如何在程序中发送Email邮件
使用.Net发电子邮件小结
电子邮件是通过互联网发出去的,互联网中传输层协议有TCP/IP协议,邮件服务在基于TCP/IP底层协议之上的应用层实现SMTP、POP3、IMAP4等协议,通过这些协议实现了邮件的收发服务。
小蜜蜂
2019/08/06
1.6K0
使用.Net发电子邮件小结
.NET Core 实现定时抓取博客园首页文章信息并发送到邮箱
大家好,我是晓晨。许久没有更新博客了,今天给大家带来一篇干货型文章,一个每隔5分钟抓取博客园首页文章信息并在第二天的上午9点发送到你的邮箱的小工具。比如我在2018年2月14日,9点来到公司我就会收到一封邮件,是2018年2月13日的博客园首页的文章信息。写这个小工具的初衷是,一直有看博客的习惯,但是最近由于各种原因吧,可能几天都不会看一下博客,要是中途错过了什么好文可是十分心疼的哈哈。所以做了个工具,每天归档发到邮箱,妈妈再也不会担心我错过好的文章了。为什么只抓取首页?因为博客园首页文章的质量相对来说高一些。
晓晨
2018/02/23
1.2K0
.NET Core 实现定时抓取博客园首页文章信息并发送到邮箱
.NET实现注册发送邮件激活账户
要实现注册的时候同时发送一个邮件到注册人的邮箱,通过发送的邮箱链接来激活帐号,发送邮件实现如下:
用户1503405
2021/09/23
6000
相关推荐
MYSQL自动备份并发送邮件工具
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文