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

本文介绍了使用System.Net.Mail.SmtpClient通过SSL/TLS协议发送邮件时遇到的异常问题及解决方法。问题源于SSL/TLS协议版本不支持,解决方案包括切换到System.Web.Mail(仅适用于.NET Framework)或使用支持TLS的MailKit库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

1、问题现象

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

详细报错信息:

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)

示例代码

using System.Web.Mail;
using System;

namespace Ken.IO.Util {
   

    class Program
    {
   
        public static void Main (string[] args)
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值