.NET发邮件(验证码)
前端不说了。主要讲后端。通过postman模拟前端请求。
参考文章:.NET发送邮箱(验证码)_紫晶城的博客-CSDN博客 但实践过程中发现一些问题,现已解决。故在此做一个记录。
第1步:设置发件邮箱开启POP3服务。我这边是126邮箱。
第2步:写后端代码:
接口:SendEmailVerificationCode4Register
/// /// 注册页面,发送邮箱验证码 /// /// /// [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; } /// /// 生成4位数字验证码 /// /// 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:
/// /// 发送邮箱 /// /// 收件人 /// 邮件主题 /// 邮件内容 /// public static void SendEmail1(string mailTo, string mailSubject, string mailContent) { try { SmtpClient mailClient = new SmtpClient("smtp.126.com"); mailClient.EnableSsl = true; mailClient.UseDefaultCredentials = false; //Credentials登陆SMTP服务器的身份验证. mailClient.Credentials = new NetworkCredential("你的发件邮箱@126.com", "pop3授权密码");//邮箱,pop3授权密码(注意不是你的126邮箱登录密码) MailMessage message = new MailMessage(new MailAddress("你的发件邮箱@126.com"), new MailAddress(mailTo));//发件人,收件人 message.IsBodyHtml = true; // message.Bcc.Add(new MailAddress("tst@qq.com")); //可以添加多个收件人 message.Body = mailContent;//邮件内容 message.Subject = mailSubject;//邮件主题 //Attachment 附件 //Attachment att = new Attachment(@"C:/hello.txt"); //message.Attachments.Add(att);//添加附件 //Console.WriteLine("Start Send Mail...."); //发送.... mailClient.Send(message); // 发送邮件 } catch (Exception e) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(LoggerHelper.GetErrorMsg(e, "EmailHelper", "SendEmail1", null)); } }
第3步,执行。
运行结果:
期间遇到两次报错:
- 报错1:
- 报错信息:邮件发送问题,邮箱不可用,服务器响应为【此处是一段乱码】
- 报错代码:mailClient.Send(message); // 发送邮件
- 出错原因:经排查,发现是POP3服务未开启。开启后此报错即可解决。
- 报错2:
- 报错信息:不允许使用邮箱名称。 服务器响应为:authentication is required
- 错误代码(依然是):mailClient.Send(message); // 发送邮件
- 出错原因:经排查,发现是这段代码中的密码,我用了邮箱的登录密码,而不是POP3授权密码。改成POP3授权密码即可解决。
mailClient.Credentials = new NetworkCredential("你的发件邮箱@126.com", "pop3授权密码");//邮箱,pop3授权密码(注意不是你的126邮箱登录密码)