.NET发邮件(验证码)

前端不说了。主要讲后端。通过postman模拟前端请求。

参考文章:.NET发送邮箱(验证码)_紫晶城的博客-CSDN博客 但实践过程中发现一些问题,现已解决。故在此做一个记录。

第1步:设置发件邮箱开启POP3服务。我这边是126邮箱。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiH57OV5biI,size_20,color_FFFFFF,t_70,g_se,x_16

第2步:写后端代码:

接口:SendEmailVerificationCode4Register

        /// <summary>
        /// 注册页面,发送邮箱验证码
        /// </summary> 
        /// <param name="phoneNum"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult SendEmailVerificationCode4Register(SendEmailVerificationCode4RegisterModel emailVerifyModel)
        {
            var result = new ResultDto();//定义一个接口响应对象,其实就是一个object,方便把结果返回给前端

            #region 一些数据验证

            //非空验证
            if (emailVerifyModel == null)
            {
                return Json(result.Error("传入参数为空"));
            }
            if (string.IsNullOrWhiteSpace(emailVerifyModel.Email))
            {
                return Json(result.Error("邮箱不能为空"));
            }
            if (string.IsNullOrWhiteSpace(emailVerifyModel.UserName))
            {
                return Json(result.Error("用户名不能为空"));
            }

            //验证邮箱格式
            if (!RegexHelper.IsEmail(emailVerifyModel.Email))
            {
                return Json(result.Error("邮箱格式不正确"));
            }

            //系统用户表:
            var existSysUser = _sysUserDbContext.SysUsers.FirstOrDefault(m => (m.UserName == emailVerifyModel.UserName || m.Email == emailVerifyModel.Email) && !m.Deleted);
            if (existSysUser != null)
            {
                if (existSysUser.UserName == emailVerifyModel.UserName)
                {
                    return Json(result.Error("用户名已存在"));
                }
                return Json(result.Error("邮箱已存在"));
            }

            #endregion

            //开始发送邮件
            var verifyCode = SendEmailVerificationCode(emailVerifyModel.Email);
            result.Data = new
            {
                verifyCode
            };

            return Json(result.OK("发送成功"), JsonRequestBehavior.AllowGet);
        }

SendEmailVerificationCode:

        private string SendEmailVerificationCode(string emailTo)
        {
            string verifyCode = GenerateVerifyCode();
            //发送验证码
            string content = "****提醒您:您正在使用邮箱安全验证服务,您本次操作的验证码是:" + verifyCode;
            string subject = "【****】登录注册用户信息提示";

            EmailHelper.SendEmail1(emailTo, subject, content);

            return verifyCode;

        }

        /// <summary>
        /// 生成4位数字验证码
        /// </summary>
        /// <returns></returns>
        public static string GenerateVerifyCode()
        {
            Random rad = new Random();//实例化随机数产生器rad;
            int value = rad.Next(1000, 10000);//用rad生成大于等于1000,小于等于9999的随机数;

            //随机生成4位验证码
            string verifyCode = value.ToString();
            return verifyCode;
        }

EmailHelper.SendEmail:

        /// <summary>
        /// 发送邮箱
        /// </summary>
        /// <param name="mailTo">收件人</param>
        /// <param name="mailSubject">邮件主题</param>
        /// <param name="mailContent">邮件内容</param>
        /// <returns></returns>
        [Obsolete]
        public static void SendEmail1(string mailTo, string mailSubject, string mailContent)
        {
            Logger logger = LogManager.GetCurrentClassLogger();
            try
            {
                ///这里我使用已经过时的邮件库System.Web.Mail发送邮件
                ///微软推荐我们使用System.Net.Mail发送邮件,但System.Net.Mail并不支持所有协议,导致在使用过程中会出现无法发送的情况
                ///我遇到的报错信息如下:无法从传输连接中读取数据: net_io_connectionclosed
 
                System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage();
 
                mail.To = mailTo;
                mail.From = "你的发件邮箱@126.com";
                mail.Subject = mailSubject;     //邮件主题
                mail.BodyFormat = System.Web.Mail.MailFormat.Html;
                mail.Body = mailContent;        //邮件内容
                //邮箱地址
                mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", mail.From);
                //密码 不是邮箱登陆密码 而是邮箱设置POP3/SMTP 时生成的第三方客户端授权码
                mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "pop3授权密码");
                //验证信息,填1就行
                mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); 
                //使用服务器的哪个端口发送邮件(注意:服务器需要开放此端口。再次注意:阿里云直接屏蔽了默认的25端口,除非单独找阿里客服申请开放25端口,这里我调整到465端口上)
                mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 465);
                //使用ssl
                mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
 
                System.Web.Mail.SmtpMail.SmtpServer = "smtp.126.com";
                System.Web.Mail.SmtpMail.Send(mail);
            }
            catch (Exception e)
            {
                logger.Error($"邮箱发送失败,收件人:{mailTo}, 邮件主题:{mailSubject},正文:{mailContent}\n异常信息:{LoggerHelper.GetErrorMsg(e, "EmailHelper", "EmailHelper", null)}");
            }
        }

第3步,执行。

运行结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiH57OV5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YiH57OV5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 期间遇到两次报错:

  1. 报错1:
    1. 报错信息:邮件发送问题,邮箱不可用,服务器响应为【此处是一段乱码】
    2. 报错代码:mailClient.Send(message); // 发送邮件
    3. 出错原因:经排查,发现是POP3服务未开启。开启后此报错即可解决。
  2. 报错2:
    1. 报错信息:不允许使用邮箱名称。 服务器响应为:authentication is required
    2. 错误代码(依然是):mailClient.Send(message); // 发送邮件
    3. 出错原因:经排查,发现是这段代码中的密码,我用了邮箱的登录密码,而不是POP3授权密码。改成POP3授权密码即可解决。
mailClient.Credentials = new NetworkCredential("你的发件邮箱@126.com", "pop3授权密码");//邮箱,pop3授权密码(注意不是你的126邮箱登录密码)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

切糕师学AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值