.Net FrameWork 框架下使用System.Net.Mail封装类 发送邮件失败:服务器响应:5.7.1 Client was not authenticated 解决方案

这篇具有很好参考价值的文章主要介绍了.Net FrameWork 框架下使用System.Net.Mail封装类 发送邮件失败:服务器响应:5.7.1 Client was not authenticated 解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

偶然兴起,想做一个后台监控PLC状态的服务。功能如下:监控到PLC状态值异常后触发邮件推送,状态改变后只推送一次。开始使用的是.net6.0开发框架开发,一切都很顺利,邮件也能正常推送。但由于现场工控机系统不是WIN10 20H2的最新版本,导致系统未安装.Net6.0 Runtime。而我也没有再去安装的打算。我重新使用了.net FrameWork4.7 框架进行开发。开发完成后,我以为能正常运行。但出现了不可预知的错误——服务器响应:5.7.1 Client was not authenticated。下面分别是2个框架下发送邮件的代码:
.Net 6.0框架:

点击查看代码
public bool Send()
{
    try
    {
        SmtpClient smtp = new SmtpClient(this.Host!, (int)this.Port!) { Credentials = new NetworkCredential(this.User!, this.Password!), EnableSsl = true, UseDefaultCredentials = false };
        MailMessage message = new MailMessage(this.SenderAddress!, this.ReciverAddress!, this.Subject, this.Body) { From = new MailAddress(this.SenderAddress!, this.SenderName) };
        ServicePointManager.ServerCertificateValidationCallback = delegate (object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        };
        smtp.Send(message);
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

.Net FrameWork 4.7 框架:

点击查看代码
public bool Send()
{
    try
    {
        SmtpClient smtp = new SmtpClient(this.Host!, (int)this.Port!) { Credentials = new NetworkCredential(this.User!, this.Password!), EnableSsl = true, UseDefaultCredentials = false };
        MailMessage message = new MailMessage(this.SenderAddress!, this.ReciverAddress!, this.Subject, this.Body) { From = new MailAddress(this.SenderAddress!, this.SenderName) };
        ServicePointManager.ServerCertificateValidationCallback = delegate (object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        };
        smtp.Send(message);
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}
在不同的开发框架下,使用的代码完全一致。但是在.Net FrameWork 4.7 框架下发送邮件才会出现异常:**5.7.1 Client was not authenticated**,而.Net 6.0 环境下不会。

我不得不怀疑是不是微软的封装类System.Net.Mail存在问题。经过断点调试,终于发现了2个环境发送邮件时存在的差异。
.Net 6.0框架下用户传入的凭证(账号密码)SMTP服务器可正常获取到

.Net FrameWork 框架下使用System.Net.Mail封装类 发送邮件失败:服务器响应:5.7.1 Client was not authenticated 解决方案
.Net FrameWork 框架下竟然获取的凭证为空

.Net FrameWork 框架下使用System.Net.Mail封装类 发送邮件失败:服务器响应:5.7.1 Client was not authenticated 解决方案

经过短暂思考,我决定修改下.Net FrameWork框架下的开发代码。如下:文章来源地址https://www.toymoban.com/news/detail-776950.html

点击查看代码
public bool Send()
{
    try
    {
        smtp = new SmtpClient(this.Host, (int)this.Port);
        smtp.Credentials = new NetworkCredential(this.User,this.Password);
        smtp.EnableSsl = true;
        //smtp.UseDefaultCredentials = false;
        MailMessage message = new MailMessage(this.SenderAddress, this.ReciverAddress, this.Subject, this.Body) { From = new MailAddress(this.SenderAddress, this.SenderName) };
        ServicePointManager.ServerCertificateValidationCallback = delegate (object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        };
        smtp.Send(message);
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}
上述代码中,取消了UseDefaultCredentials属性的使用。运行后,邮件发送正常。 那么问题来了,为什么使用了UseDefaultCredentials属性就会导致Credentials 凭证为空呢?看下.Net FrameWork框架System.Net.Mail源码:
点击查看代码
public bool UseDefaultCredentials
{
    get
    {
        if (!(transport.Credentials is SystemNetworkCredential))
        {
            return false;
        }

        return true;
    }
    set
    {
        if (InCall)
        {
            throw new InvalidOperationException(SR.GetString("SmtpInvalidOperationDuringSend"));
        }

        transport.Credentials = (value ? CredentialCache.DefaultNetworkCredentials : null);
    }
}
再对比下.net6.0 框架System.Net.Mail源码:
点击查看代码
 //
 // 摘要:
 //     Gets or sets a System.Boolean value that controls whether the System.Net.CredentialCache.DefaultCredentials
 //     are sent with requests.
 //
 // 返回结果:
 //     true if the default credentials are used; otherwise false. The default value
 //     is false.
 //
 // 异常:
 //   T:System.InvalidOperationException:
 //     You cannot change the value of this property when an email is being sent.
 public bool UseDefaultCredentials
 {
     get;
     set;
 }
水落石出,微软误我啊!😂

到了这里,关于.Net FrameWork 框架下使用System.Net.Mail封装类 发送邮件失败:服务器响应:5.7.1 Client was not authenticated 解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot 发送邮件,以及邮件工具类 并且解决spring-boot-starter-mail 发送邮件附件乱码或者文件错乱

    1、设置系统值 System.setProperty(“mail.mime.splitlongparameters”, “false”); 2、 在创建对象的时候定义编码格式(utf-8): MimeMessageHelper helper = new MimeMessageHelper(mes, true, “utf-8”); 3、 其次,在添加附件的时候,附件名是需要定义编码的 helper.addAttachment(MimeUtility.encodeWord(附件名,“utf-8”

    2024年02月15日
    浏览(45)
  • laravel中Mail发送邮件失败,但是没有错误信息,该如何调试?

    在Laravel中,当使用Mail类发送邮件失败但没有错误信息显示时,可以按照以下步骤进行调试: 检查日志文件: Laravel会记录各种应用程序活动和错误信息。查看应用程序的日志文件,通常位于 storage/logs 目录下,寻找与邮件相关的错误消息。 开启调试模式: 在 .env 文件中将

    2024年02月11日
    浏览(37)
  • 关于MSMQ(System.Messaging.MessageQueue)安装及在.NET Framework框架下的简单应用实现,以解决大并发请求问题

    提示:大并发请求队列处理及实时聊天消息也可参考本文自行实现 随着大数据的不断发展,我们实际开发的项目也开始逐渐接触到大数据大并发造成的一些问题,由于近期项目需求要满足2000并发量,经过压测发现原项目中编写的正常逻辑读写程序很卡顿,服务器环境Windows

    2024年02月06日
    浏览(33)
  • asp.net使用MailMessage发送邮件的方法

     控件名称及ID如下: 书写后台代码之前需要先了解MailMessage类中的各个属性:         From:发件人邮箱地址。 To:收件人的邮箱地址。     CC:抄送人邮箱地址。 Subject:邮件标题。 Body:邮件内容。        Attachments:邮件附件         此外MailMessage还需要用到Smtp

    2024年02月06日
    浏览(34)
  • 【C#】.Net Framework框架使用JWT

    2023年,第31周,第2篇文章。给自己一个目标,然后坚持总会有收货,不信你试试! 本篇文章主要简单讲讲,.Net Framework框架下使用JWT的代码例子,以及他们的基本概念。 2002年微软发布了.net framework 1.0,那个时候博主刚开始玩传奇游戏,接触电脑的时间还是挺早的。 JWT(JS

    2024年02月15日
    浏览(41)
  • 【C#】.Net Framework框架下使用SQLike以及基本概念

    2023年,第32周,第2篇文章。给自己一个目标,然后坚持总会有收货,不信你试试! 在C#的.NET Framework框架下,有很多轻量级数据库选择,比如:SQLike就是其中一款,一起来了解SQLike的简单使用吧。 轻量级数据库是指具有较小的存储需求、资源消耗较低、易于部署和使用的数据

    2024年02月11日
    浏览(64)
  • 使用群晖NAS Mail Server搭建个性化邮件系统

    一个顶级域名 可以获取公网IP的宽带 路由使用DDNS功能,或使用群晖自带DDNS,解析顶级域名 可以做“端口映射”的路由器 step1:安装套件 登录群晖NAS,打开[套件中心],搜索“mail”,安装如下两个套件:“MailPlus server”、“MailPlus”; step2:安装MailPlus server服务端 打开“M

    2024年02月16日
    浏览(43)
  • .NET 个人博客-发送邮件优化?

    之前的发送邮件就弄了个方法,比如回复评论会给评论的人发送邮件,留言回复也是,而且2者的代码有很多一样的地方,比较冗余。然后也是抽空优化一下,思路也是比较常用的工厂+策略模式,然后评论回复和留言回复的模板是不一样的,所以需要创建模板类和方法。。。

    2024年02月13日
    浏览(34)
  • 如何使用Java Mail发邮件(包括单发和群发),含演示代码下载

    在我们做业务系统开发时时,经常会用到 邮件发送的场景,如 通过邮件通知给注册用户有关注册码的内容,或者 管理的某些设备有告警了,需要邮件通知相关维护人员及时处理相关设备,还有 使用的会员服务已经到期了,用邮件通知给用户等等。 在java 世界里如何发邮件,

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包