在 ASP.NET Core 中发送邮件遇到的坑_学习笔记 使用GB2312编码报错的问题.

功能需求

        因为项目需要有个忘记密码验证邮箱再重新修改密码的功能,然后我选用了很简单的一个方案,通过验证登录用户的邮箱然后发送邮件,通过这个邮件发送的链接地址来最后实现密码修改的小功能。

项目环境及实现

         网上有人说目前 .NET Core 还不支持 SMTP 协议,我使用的.net core 2.1这个版本还是可以的。但是1.0,1.1的旧版本是不行的,有兴趣可以去试,我是从1.0升级上来才发现的...当然还可借助于一些第三方组件来达到目的,具体可参考资料 https://www.cnblogs.com/savorboard/p/aspnetcore-email.html, 下面我介绍一下我的方法:

简单邮件发送核心代码如下:

 1         public RequestResult SendEmail(EmailModel model)
 2         {
 3 
 4             SmtpClient client = new SmtpClient()
 5             {
 6                 Host = model.SmtpServer, //"smtp.qq.com";
 7                 Port = 25,
 8                 //通过网络发送到SMTP服务器
 9                 DeliveryMethod = SmtpDeliveryMethod.Network,
10                 //发件人登录邮箱的用户名和密码
11                 Credentials = new NetworkCredential(model.UserId, model.Password.Trim())
12             };
13             MailAddress fromAddress = new MailAddress(model.SendEmail, model.SendName);
14             MailAddress toAddress = new MailAddress(model.ReceiveEmail, model.ReceiveName);
15             MailMessage mailMessage = new MailMessage(fromAddress, toAddress);
16             mailMessage.Subject = "測試郵件";
17             mailMessage.Body = "einspect系統測試郵件密碼是否正確";
18             mailMessage.SubjectEncoding = Encoding.UTF8;
19             mailMessage.BodyEncoding = Encoding.UTF8;// Encoding.GetEncoding("GB2312");
20             mailMessage.Priority = MailPriority.High;
21             try
22             {
23                 client.Send(mailMessage);//发送邮件
24                 result.Message = "发送成功!";
25                 result.IsSuccess = true;
26             }
27             catch (Exception ex)
28             {
29                 //  1. 连接SMTP服务器失败
30                 //  2. 用户名或密码验证错误
31                 //  3. 超时
32                 //  这三种情况导致抛出SmtpClient异常
33                 // -------
34                 result.Message = "测试失败!";
35                 result.IsSuccess = false;
36             }
37 
38             return result;
39         }

总结经验

        【另外我已把我的DEMO源码打包,欢迎下载,地址:https://download.csdn.net/download/buxaingzhangda/10874816

  • 遇到的第一个坑,邮箱不可用. has no permission 这样的错误.

      英文错误为:Mailbox unavailable. The server response was: User has no permission.

     【其实用.Net发送邮件时相当于自定义客户端根据用户名和密码进行登录,然后使用SMTP服务发送邮件。但新注册的163邮件默认是不开启客户端授权验证的,qq邮箱的也是需要手动开启不然登录总是会被拒绝,验证没有权限。解决办法是进入相关邮箱去设置客户端授权密码,选择开启即可,如下截图

         

         

   注意:最后,切忌设置完毕后,在代码中用使用客户端授权密码代替原始的邮箱密码,这样就可以正确的发送邮件了。

        'GB2312' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

        上面是抛出的异常信息。我的解决方案是:将编码格式统一改成了UTF-8。【使用UTF-8的一个好处是其他地区的用户(如香港台湾)无需安装简体中文支持就能正常观看你的文字*而不会出现乱码。*
         也在这补充一下gb2312是简体中文的码;gbk支持简体中文及繁体中文;big5支持繁体中文;utf-8支持几乎所有字符 】

    

1    MailMessage mailMessage = new MailMessage(fromAddress, toAddress);
2             mailMessage.Subject = "測試郵件";
3             mailMessage.Body = "einspect系統測試郵件密碼是否正確";
4             mailMessage.SubjectEncoding = Encoding.UTF8;
5             mailMessage.BodyEncoding = Encoding.UTF8;// Encoding.GetEncoding("GB2312");

 另外我再分享一个别人的处理方案,我嫌麻烦,想看的也可以看看,https://www.cnblogs.com/chr-wonder/p/8464204.html

  • 遇到的第三个坑,输入发件人的账号时,不是输入邮箱的完整地址.(如:你的邮箱[email protected],那么你的登录账号通常就是abcd)

SmtpClient client = new SmtpClient()
            {
                Host = model.SmtpServer, //"smtp.qq.com";
                Port = 25, //端口
                //通过网络发送到SMTP服务器
                DeliveryMethod = SmtpDeliveryMethod.Network,
                //发件人登录邮箱的用户名和密码
                Credentials = new NetworkCredential(model.UserId, model.Password.Trim()) // 邮箱登录账号 abcd ,密码 qvkqkyiuebjhi
            };

   好了,整个过程分享完了,本人比较懒也觉得不太擅长写东西,偶尔有兴致就记录一下吧,学习的路上总是痛苦漫长的,但过程结果会给你带来快乐和成就感。让我们一起成长吧,各路大神如发现错误请帮忙指正,我会虚心修改的,最后感谢不喷,18年就要结束了,让我们用新的姿态去迎接新的一年吧!

  

猜你喜欢

转载自www.cnblogs.com/hwjy/p/10172784.html