SpringBoot发送邮件功能 验证码5分钟过期

springBoot发送邮件(验证码,5分钟过期)超级详细,供大家参考,具体内容如下

自己百度了很久,终于成功了,这里记录一下过程

1.选择邮箱(这里选用163邮箱)

首先在网页登录在设置里面打开POP3/SMTP服务

在application.yaml中配置

要注意的就是这里的password是授权码而不是密码!!!如果使用qq邮箱把host改为smtp.qq.com

2.关于验证码的工具类

 private static final String SYMBOLS = "0123456789";
 /**
  * Math.random生成的是一般随机数,采用的是类似于统计学的随机数生成规则,其输出结果很容易预测,因此可能导致被攻击者击中。
  * 而SecureRandom是真随机数,采用的是类似于密码学的随机数生成规则,其输出结果较难预测,若想要预防被攻击者攻击,最好做到使攻击者根本无法,或不可能鉴别生成的随机值和真正的随机值。
  */
 private static final Random RANDOM = new SecureRandom();

 public static String generateVerCode() {
  char[] nonceChars = new char[6];
  for (int i = 0; i < nonceChars.length; i++) {
   nonceChars[i] = SYMBOLS.charAt(RANDOM.nextInt(nonceChars.length));
  }
  return new String(nonceChars);
 }

 /**
  *计算两个日期的分钟差
  */
 public static int getMinute(Date fromDate, Date toDate) {
  return (int) (toDate.getTime() - fromDate.getTime()) / (60 * 1000);

3.services模块

 /**
  * 发送验证码到指定邮箱
  * @param sender 发送地址
  * @param mailSender spring自带
  * @param receiver 接受地址
  */
 AdvanceResponse getCode(String sender,JavaMailSenderImpl mailSender,String receiver);
 /**
  * 注册用户
  */
 AdvanceResponse addUser(User user,String verCode);

AdvanceResponse是自己封装的返回对象,可以无视

/**
 * 验证码
*/
private String code;
/**
 * 发送时间
*/
private Date sendTime;
 @Override
 @Async
 public AdvanceResponse getCode(String sender, JavaMailSenderImpl mailSender, String receiver) {
  SimpleMailMessage message = new SimpleMailMessage();
  message.setSubject("验证码");//设置邮件标题
  code = VerCodeGenerateUtil.generateVerCode();
  sendTime = new Date();
  message.setText("尊敬的用户,您好:\n"
    + "\n本次请求的邮件验证码为:" + code + ",本验证码5分钟内有效,请及时输入。(请勿泄露此验证码)\n"
    + "\n如非本人操作,请忽略该邮件。\n(这是一封自动发送的邮件,请不要直接回复)"); //设置邮件正文
  message.setFrom(sender);//发件人
  message.setTo(receiver);//收件人
  mailSender.send(message);//发送邮件
  return AdvanceResponse.successResponse();
 }

 @Override
 public AdvanceResponse addUser(User user, String verCode) {
  Date date = new Date();
  //判断验证码
  if (VerCodeGenerateUtil.getMinute(sendTime, date) > 5) {
   return AdvanceResponse.failedResponse("验证码已经失效!!!");
  }
  if (!verCode.equals(code)) {
   return AdvanceResponse.failedResponse("验证码不正确!!!");
  }
  user.setRole(0);
  user.setCreateTime(date);
  user.setUpdateTime(date);
  userDao.insert(user);
  code = null;
  return AdvanceResponse.successResponse();
 }

@Async表示异步,可以在邮件未发送完成时就返回,而不必等待太长时间,必须在总配置类上加@EnableAsync注解才可以生效

4.controller模块

@Autowired
 private UserService userService;
 @Autowired
 private JavaMailSenderImpl mailSender;
 @Value("${spring.mail.username}")
 private String sender;

 /**
  * 发送验证码到指定邮箱
  */
 @GetMapping("/verCode")
 public AdvanceResponse verCode(String receiver) {
  return userService.getCode(sender, mailSender, receiver);
 }

 /**
  * 注册用户
  */
 @PostMapping("/addUser")
 public AdvanceResponse addUser(User user, String sender, JavaMailSenderImpl mailSender, @RequestParam("verCode") String verCode) {
  return userService.addUser(user,verCode);
 }

基本上后端就完成了,在来看看前端

5.前端界面

 <div class="layui-form-item">
    <label for="email" class="layui-form-label">
     <span class="x-red">*</span>邮箱
    </label>
    <div class="layui-input-inline">
     <input type="email" id="email" name="email" required="" lay-verify="email"
       autocomplete="off" class="layui-input">
    </div>
    <div class="layui-form-mid layui-word-aux">
     <span class="x-red" id="emailMsg"></span>
    </div>
    <button type="button" class="layui-btn" id="code">获取验证码</button>
   </div>
   <div class="layui-form-item">
    <label for="verCode" class="layui-form-label">
     <span class="x-red">*</span>验证码
    </label>
    <div class="layui-input-inline">
     <input type="text" id="verCode" name="verCode" required=""
       autocomplete="off" class="layui-input">
    </div>
    <div class="layui-form-mid layui-word-aux">
     <span class="x-red" id="verCodeMsg"></span>
    </div>
</div>

前端使用了layui,只关注input表单即可

接下来是js代码

 //获取验证码
 $('#code').click(function () {
  const email = $('#email').val();
  const myReg = /^[a-zA-Z0-9_-]+@([a-zA-Z0-9]+\.)+(com|cn|net|org)$/;
  if (email === null || email.length === 0) {
   layer.msg('邮箱不能为空!', {time: 1500, icon: 5, shift: 6});
   return false;
  }
  if (!myReg.test(email)) {
   layer.msg('邮箱格式不正确!', {time: 1500, icon: 5, shift: 6});
   return false;
  }
  $.ajax({
   type: 'GET',
   url: 'user/verCode',
   data: {
    'receiver': email
   },
   beforeSend: function () {
    loading = layer.msg('处理中', {icon: 16})
   },
   success: function () {
    layer.close(loading);
   }
  })
 });
 //这是提交表单,只保留关键部分
 $.ajax({
   type: 'POST',
   url: 'user/addUser',
   data: formData,
   cache: false,   // 不缓存
   processData: false,  // jQuery不要去处理发送的数据
   contentType: false,  // jQuery不要去设置Content-Type请求头
   beforeSend: function () {
    loading = layer.msg('处理中', {icon: 16})
   },
   success: function (result) {
    if (result.status === 0) {
     layer.msg(result.msg, {time: 1500, icon: 5, shift: 6});
    } else {
     layer.close(loading);
     xadmin.close();
    }
   }
  })

基本上全部完成!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot实现发送邮件功能

    背景 有个小伙伴问我你以前发邮件功能怎么弄的.然后我就给他找了个demo,正好在此也写一下,分享给大家. 理清痛点 发送邮件,大家可以想一下,坑的地方在哪? 我觉得是三个吧. 第一:邮件白名单问题. 第二:邮件超时问题. 第三:邮件带附件问题. 我下面的demo都会介绍这些问题及解决. 实现方案 准备工作 我们先要准备一个可以发送的邮箱,我这里以我的163邮箱为例,现在发送邮件的规则,要求你输入一种叫做授权码的东西,注意这个东西不是密码. 获取授权码的步骤: 当选择开启,通过验证之后就可以获取到

  • SpringBoot集成E-mail发送各种类型邮件

    SpringBoot 集成 E-mail发送邮件,供大家参考,具体内容如下 JDK本身有自带发送邮件api,加上SpringBoot在进行封装,使得现在使用起来十分快速简洁. 话不多说,参考纯洁的微笑博客,更改jar版本为2.0.4 开干,基本没什么坑. 就是配置邮箱账号密码是,如果是qq邮箱,需要开启PO30和STMP服务,并且获取临时授权码. 开启服务链接: https://mail.qq.com/cgi-bin/frame_html?sid=a5ZSbreeNm9pHyl1&r=a8322

  • SpringBoot使用FreeMarker模板发送邮件

    本文实例为大家分享了SpringBoot +Mail+FreeMarker发送邮件,供大家参考,具体内容如下 通过spirngboot 自带的mail服务及FreeMarker模板引擎,发送邮 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </depen

  • SpringBoot JavaMailSender发送邮件功能

    本文实例为大家分享了SpringBoot JavaMailSender发送邮件的具体代码,供大家参考,具体内容如下 引入Maven依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 163邮箱 application.properties

  • 基于SpringBoot实现发送带附件的邮件

    这篇文章主要介绍了基于SpringBoot实现发送带附件的邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 <!--发送email依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependenc

  • springboot实现添加邮件发送及压缩功能

    这次本来只讲讲邮件发送功能的,惮于内容比较贫乏,故加了点儿文件压缩的功能讲解. 首先邮件发送,邮件功能在springboot里面是有对应的依赖组件,这个: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> spring-boot-starter-mail</artifactId> </dependency> 邮件功能开发在springboot里面

  • SpringBoot中发送QQ邮件功能的实现代码

    本文是vhr系列的第十二篇,项目地址 https://github.com/lenve/vhr 邮件发送也是一个老生常谈的问题了,代码虽然简单,但是许多小伙伴对过程不太理解,所以还是打算和各位小伙伴聊聊这个话题. 邮件协议 我们经常会听到各种各样的邮件协议,比如SMTP.POP3.IMAP,那么这些协议有什么作用,有什么区别?我们先来讨论一下这个问题. SMTP是一个基于TCP/IP的应用层协议,江湖地位有点类似于HTTP,SMTP服务器默认监听的端口号为25.看到这里,小伙伴们可能会想到既然S

  • SpringBoot实现发送邮件任务

    本文实例为大家分享了SpringBoot实现发送邮件任务的具体代码,供大家参考,具体内容如下 1.pom中引入spring-boot-starter-mail <dependencies> <!--邮件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> &

  • Springboot实现邮件发送功能

    本文实例为大家分享了Springboot实现邮件发送具体代码,供大家参考,具体内容如下 需求:用户注册账号绑定邮箱之后,下次登录时忘记密码,需要通过邮箱找回密码 1.创建springboot项目 2.pom导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </depen

  • SpringBoot实现发送邮件功能过程图解

    首先创建一个邮箱账号,建议@126.com,@163.com,@qq.com 都可以 开启smtp,以下是使用图解: 创建SpringBoot项目导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 支持发送邮件 -->

随机推荐