SpringBoot-Mail工具实现邮箱验证码登录注册功能

 更新时间:2024年07月16日 10:13:23   作者:Dpaper  
现在许多pc程序都有着使用邮箱验证码实现登录注册的功能,那么我们应该如何完成邮箱验证码功能呢,我们可以使用springboot内置的springboot-mail再结合redis来完成这个功能,感兴趣的朋友跟随小编一起看看吧

前言

现在许多pc程序都有着使用邮箱验证码实现登录注册的功能,那么我们应该如何完成邮箱验证码功能呢,我们可以使用springboot内置的springboot-mail再结合redis来完成这个功能。

代码实现

一、引入springboot-mail和redis依赖

<!--邮箱依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二、邮箱常量类

public class MailConstant {
   /**
    * 邮箱验证redis前缀
    */
   public static final String CODE_KEY_PREFIX = "mail:";
}

三、邮箱工具类

@Slf4j
@Service
public class MailUtils {
   @Resource
   RedisTemplate<String, Integer> redisTemplate;
   @Resource
   private JavaMailSenderImpl mailSender;
   public void sendMail(Mail mail) throws MailSendException {
      try {
         MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);
      if (mail.getFrom() == null || mail.getFrom().isEmpty()) {
         mail.setFrom("xxx");
      }
      //邮件发信人
      messageHelper.setFrom(mailSender.getUsername() + '(' + mail.getFrom() + ')');
      //邮件收信人
      messageHelper.setTo(mail.getTo().split(","));
      //邮件主题
      messageHelper.setSubject(mail.getSubject());
      //邮件内容
      messageHelper.setText(mail.getText());
      //发送邮件
      mailSender.send(messageHelper.getMimeMessage());
      } catch (Exception e) {
         log.warn("邮件发送失败:{}", e.getMessage());
         throw new MailSendException("邮件发送失败:" + e.getMessage());
      }
   }
   /**
    * 发送验证码邮件
    *
    * @param mail 邮件信息
    */
   public void sendVerificationCode(Mail mail) {
      // 判断当前待发送邮箱是否已经有验证码
      String key = CODE_KEY_PREFIX + mail.getTo();
      Integer code = redisTemplate.opsForValue().get(key);
      if (code != null) {
         throw new UserException("当前邮箱已经发送验证码");
      }
      // 生成随机 6位验证码
      int idenCode = (int) ((Math.random() * 9 + 1) * 100000);
      mail.setSubject("xxx");
      mail.setText("验证码:" + idenCode);
      redisTemplate.opsForValue().set(key, idenCode, 60, TimeUnit.SECONDS);
      sendMail(mail);
   }
}

四、代码调用

4.1 发送邮箱

/**
 * 发送邮箱验证码
 *
 * @param email 用户邮箱
 * @return 发送结果
 */
@PostMapping("send/code")
public Result<?> sendUserMail(String email) {
    Mail mail = new Mail();
    mail.setTo(email);
    mailUtils.sendVerificationCode(mail);
    return Result.ok(null, "发送成功");
}

4.2 用户注册

@Override
public boolean userRegister(User user, Integer captcha) {
    //判断用户是否已经注册
    User exist = getOne(Wrappers.<User>lambdaQuery().eq(User::getMail, user.getMail()));
    if(exist!=null){
        throw new UserException("用户已注册");
    }
    // 判断验证码是否相同
    String key = CODE_KEY_PREFIX + user.getMail();
    Integer authcode = (Integer) redisTemplate.opsForValue().get(key);
    if (authcode == null) {
        throw new UserException("验证码已过期,请重新发送");
    }
    if (!authcode.equals(captcha)) {
        throw new UserException("验证码错误");
    }
    return userMapper.insert(user)>0;
}

总结

以上就是springboot实现邮箱验证码登录注册的基本实现,觉得有用的大家可以点点赞。

到此这篇关于SpringBoot-Mail工具的使用-实现邮箱验证码登录注册的文章就介绍到这了,更多相关SpringBoot邮箱验证码登录注册内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ之NameServer架构设计及启动关闭流程源码分析

    RocketMQ之NameServer架构设计及启动关闭流程源码分析

    这篇文章主要为大家介绍了RocketMQ之NameServer架构设计及启动关闭流程源码分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Java中日期时间的用法总结

    Java中日期时间的用法总结

    在日常开发中,我们经常需要处理日期和时间,所以这篇文章小编为大家总结了下 Java 中日期与时间的基本概念与一些常用的用法,希望对大家有所帮助
    2023-09-09
  • Spring Boot中使用JSR-303实现请求参数校验

    Spring Boot中使用JSR-303实现请求参数校验

    这篇文章主要介绍了Spring Boot中使用JSR-303实现请求参数校验,JSR-303校验我们一般都是对Java的实体类对象进行校验,主要检验JSR-303是Java中的一个规范,用于实现请求参数校验在我们的实体类对象的属性上,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • javaweb上传下载实例完整版解析(下)

    javaweb上传下载实例完整版解析(下)

    这篇文章主要为大家详细解析了javaweb上传下载实例,本文重点在于文件下载功能的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • java synchronized用法详解

    java synchronized用法详解

    本篇文章主要介绍了java synchronized用法详解,synchronized是Java中的关键字,是一种同步锁。有兴趣的同学可以了解一下。
    2016-11-11
  • Spring Cloud CLI简单介绍

    Spring Cloud CLI简单介绍

    本文我们将介绍Spring Boot Cloud CLI(或简称Cloud CLI)。该工具为Spring Boot CLI提供了一组命令行增强功能,有助于进一步抽象和简化Spring Cloud部署。感兴趣的小伙伴们可以参考一下
    2018-12-12
  • JavaSwing基础之Layout布局相关知识详解

    JavaSwing基础之Layout布局相关知识详解

    上次我们说到View的Mearsure流程,今天接着说说layout. 关于layout,很多朋友知道它是负责布局的,那么具体是怎么布局的?viewGroup和view的layout方法又有什么不同?一起来看看吧,需要的朋友可以参考下
    2021-05-05
  • Java中RocketMq的消费方式详解

    Java中RocketMq的消费方式详解

    这篇文章主要介绍了Java中RocketMq的消费方式详解,RocketMQ的消费方式都是基于拉模式拉取消息的,而在这其中有一种长轮询机制(对普通轮询的一种优化),来平衡上面Push/Pull模型的各自缺点,需要的朋友可以参考下
    2023-10-10
  • Java的常见热门ORM框架优缺点区别

    Java的常见热门ORM框架优缺点区别

    Java ORM框架是一种用于将Java对象映射到关系型数据库中的工具,使得开发人员能够通过对象操作数据库而不必直接使用SQL查询,Java开发变得更加高效和易于维护,选择适合你的ORM框架是根据你的需求决定的,比如你的应用场景,数据结构和技术水平等
    2024-02-02
  • java获取鼠标在屏幕上坐标的方法

    java获取鼠标在屏幕上坐标的方法

    本文介绍的是如何用java获取鼠标在屏幕上的坐标,这个功能其实没什么难度可言,在这里分享给大家,是因为有时候我们需要这个工具,Java作为跨平台语言的优势在这个软件就可以体现出来,不需修改就可以在windows、mac、Linux上使用这个软件。下面来一起看看详细的介绍吧。
    2016-12-12

最新评论