> 文档中心 > .NET发邮件(验证码)

.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

 

 ///  /// 注册页面,发送邮箱验证码 ///   ///  ///  [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步,执行。

运行结果:

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邮箱登录密码)