当前位置:   article > 正文

基于SpringBoot实现邮箱验证码注册_springboot邮箱注册

springboot邮箱注册

目录

一、简介

二、代码实现

1. 添加pom依赖

2. 创建邮件发送信息传输类、授权信息类

3. 创建邮箱服务接口和实现类

4. 修改配置文件application.yml,添加相关配置信息

5. 创建邮件模板

6. 创建功能服务接口与实现类

7. 编写Controller层API接口

三、结果演示

1. 发送邮箱验证码接口

2. 注册账号接口

3. 验证码邮件示例​编辑


一、简介

        用户注册系统时,一般会以邮箱进行关联注册,需要用户输入邮箱地址以获取随机验证码,然后在注册页面输入该验证码并完善其他相关注册信息点击注册,完成注册。

        基于SpringBoot的后端开发项目实现的逻辑分为两步:

  1. 向邮箱发送随机验证码;
  2. 收到用户输入验证码进行校验完成注册;

二、代码实现

1. 添加pom依赖

  1. <!-- spring data redis 依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!-- hutool工具包依赖-->
  7. <dependency>
  8. <groupId>cn.hutool</groupId>
  9. <artifactId>hutool-all</artifactId>
  10. <version>5.5.7</version>
  11. </dependency>
  12. <!-- mail依赖-->
  13. <dependency>
  14. <groupId>javax.mail</groupId>
  15. <artifactId>mail</artifactId>
  16. <version>1.4.7</version>
  17. </dependency>
  18. <!-- 模板引擎依赖-->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-freemarker</artifactId>
  22. </dependency>

2. 创建邮件发送信息传输类、授权信息类

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class EmailDto {
  5. /**
  6. * 发送邮箱列表
  7. */
  8. private List<String> tos;
  9. /**
  10. * 主题
  11. */
  12. private String subject;
  13. /**
  14. * 内容
  15. */
  16. private String content;
  17. }
  1. @ApiModel(value = "授权用户信息")
  2. @Data
  3. @AllArgsConstructor
  4. @NoArgsConstructor
  5. public class AuthUserDto {
  6. @ApiModelProperty(value = "用户名")
  7. private String username;
  8. @ApiModelProperty(value = "密码")
  9. private String password;
  10. @ApiModelProperty(value = "临时登录凭证")
  11. private String code;
  12. @ApiModelProperty(value = "邮箱")
  13. private String email ;
  14. }

3. 创建邮箱服务接口和实现类

  1. public interface EmailService {
  2. /**
  3. * 发送邮件
  4. *
  5. * @param emailDto 邮箱列表
  6. */
  7. void send(EmailDto emailDto);
  8. }
  1. @Service
  2. @RequiredArgsConstructor
  3. public class EmailServiceImpl implements EmailService {
  4. @Value("${spring.mail.email}")
  5. private String email;
  6. @Value("${spring.mail.host}")
  7. private String host;
  8. @Value("${spring.mail.port}")
  9. private String port;
  10. @Value("${spring.mail.username}")
  11. private String username;
  12. @Value("${spring.mail.password}")
  13. private String password;
  14. @Override
  15. public void send(EmailDto emailDto) {
  16. // 读取邮箱配置
  17. if (email == null || host == null || port == null || username == null || password == null) {
  18. throw new RuntimeException("邮箱配置异常");
  19. }
  20. // 设置
  21. MailAccount account = new MailAccount();
  22. account.setHost(host);
  23. account.setPort(Integer.parseInt(port));
  24. // 设置发送人邮箱
  25. account.setFrom(username + "<" + email + ">");
  26. // 设置发送人名称
  27. account.setUser(username);
  28. // 设置发送授权码
  29. account.setPass(password);
  30. account.setAuth(true);
  31. // ssl方式发送
  32. account.setSslEnable(true);
  33. // 使用安全连接
  34. account.setStarttlsEnable(true);
  35. // 发送邮件
  36. try {
  37. int size = emailDto.getTos().size();
  38. Mail.create(account)
  39. .setTos(emailDto.getTos().toArray(new String[size]))
  40. .setTitle(emailDto.getSubject())
  41. .setContent(emailDto.getContent())
  42. .setHtml(true)
  43. //关闭session
  44. .setUseGlobalSession(false)
  45. .send();
  46. } catch (Exception e) {
  47. throw new RuntimeException(e.getMessage());
  48. }
  49. }
  50. }

4. 修改配置文件application.yml,添加相关配置信息

  1. mail:
  2. # 负责发送验证码的邮箱
  3. email: XXXX@126.com
  4. host: smtp.126.com
  5. port: 465
  6. username: XXXX
  7. # 授权码是用于登录第三方邮件客户端的专用密码。
  8. password: XXXXXXXXX
  9. #邮箱验证码有效时间/
  10. code:
  11. expiration: 300

此处授权密码需要在邮箱中申请配置,如下获取一个授权密码:【登录邮箱】-【设置】,springboot即可通过邮箱+授权码自动发送验证码邮件:

5. 创建邮件模板

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  5. <style>
  6. @page {
  7. margin: 0;
  8. }
  9. </style>
  10. </head>
  11. <body>
  12. <div class="header">
  13. <div style="padding: 10px;padding-bottom: 0px;">
  14. <p style="margin-bottom: 10px;padding-bottom: 0px;">尊敬的用户,您好:</p>
  15. <p style="text-indent: 2em; margin-bottom: 10px;">您正在注册【XXX平台】账号,您的验证码为:</p>
  16. <p class="code-text">${code}</p>
  17. <div class="footer">
  18. </div>
  19. </div>
  20. </div>
  21. </body>
  22. </html>
  23. <style lang="css">
  24. body {
  25. margin: 0px;
  26. padding: 0px;
  27. font: 100% SimSun, Microsoft YaHei, Times New Roman, Verdana, Arial, Helvetica, sans-serif;
  28. color: #000;
  29. }
  30. .header {
  31. height: auto;
  32. width: 820px;
  33. min-width: 820px;
  34. margin: 0 auto;
  35. margin-top: 20px;
  36. border: 1px solid #eee;
  37. }
  38. .code-text {
  39. text-align: center;
  40. font-family: Times New Roman;
  41. font-size: 22px;
  42. color: #C60024;
  43. padding: 20px 0px;
  44. margin-bottom: 10px;
  45. font-weight: bold;
  46. background: #ebebeb;
  47. }
  48. .footer {
  49. margin: 0 auto;
  50. z-index: 111;
  51. width: 800px;
  52. margin-top: 30px;
  53. border-top: 1px solid #DA251D;
  54. }
  55. </style>

6. 创建功能服务接口与实现类

  1. public interface AuthService {
  2. /**
  3. * 向指定邮箱发送验证码
  4. *
  5. * @param email 邮箱号
  6. * @return 结果
  7. */
  8. RespBean sendMailCode(String email);
  9. /**
  10. * 注册
  11. *
  12. * @param authUserDto 认证用户请求信息
  13. * @return 是否成功
  14. */
  15. RespBean register(AuthUserDto authUserDto);
  16. }

 主要实现两个功能

  1. 向邮箱发送随机验证码;sendMailCode
  2. 收到用户输入验证码进行校验完成注册;register
  1. @Service
  2. @RequiredArgsConstructor
  3. @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
  4. public class AuthServiceImpl implements AuthService {
  5. @Value("${code.expiration}")
  6. private Long expiration;
  7. // private final IAdminService adminService;
  8. // private final RedisUtils redisUtils;
  9. private final EmailService emailService;
  10. private final PasswordEncoder passwordEncoder;
  11. @Autowired
  12. private RedisTemplate<String,Object> redisTemplate;
  13. @Autowired
  14. private AdminServiceImpl adminService;
  15. @Override
  16. @Transactional(rollbackFor = Exception.class)
  17. public RespBean register(AuthUserDto authUserDto) {
  18. ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
  19. // 通过email获取redis中的code
  20. Object value = valueOperations.get(authUserDto.getEmail());
  21. if (value == null || !value.toString().equals(authUserDto.getCode())) {
  22. return RespBean.error("无效验证码!");
  23. }
  24. // 如果前端没有传入用户名,则以邮箱号作为用户名进行注册
  25. String userName = StringUtils.isEmpty(authUserDto.getUsername()) ? authUserDto.getEmail() : authUserDto.getUsername();
  26. if (adminService.getAdminByUserName(userName) != null) {
  27. return RespBean.error("用户名已存在!");
  28. }
  29. // 创建用户
  30. Admin admin = new Admin();
  31. admin.setUsername(userName);
  32. try {
  33. admin.setPassword(passwordEncoder.encode(authUserDto.getPassword()));
  34. } catch (Exception e) {
  35. return RespBean.error("注册密码异常!");
  36. }
  37. admin.setEmail(authUserDto.getEmail());
  38. if(adminService.create(admin) == null){
  39. return RespBean.error("用户注册失败!");
  40. };
  41. redisTemplate.delete(authUserDto.getEmail());
  42. return RespBean.success("用户注册成功!");
  43. }
  44. @Override
  45. public RespBean sendMailCode(String email) {
  46. ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
  47. // 查看注册邮箱是否存在
  48. if (adminService.registerEmailExist(email)) {
  49. return RespBean.error("邮箱已被注册!");
  50. }
  51. // 获取发送邮箱验证码的HTML模板
  52. TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH));
  53. Template template = engine.getTemplate("email-code.ftl");
  54. // 从redis缓存中尝试获取验证码
  55. Object code = valueOperations.get(email);
  56. if (code == null) {
  57. // 如果在缓存中未获取到验证码,则产生6位随机数,放入缓存中
  58. code = RandomUtil.randomNumbers(6);
  59. try {
  60. valueOperations.set(email, code, expiration, TimeUnit.SECONDS);
  61. } catch (Exception e) {
  62. return RespBean.error("后台缓存服务异常");
  63. }
  64. }
  65. // 发送验证码
  66. emailService.send(new EmailDto(Collections.singletonList(email),
  67. "邮箱验证码", template.render(Dict.create().set("code", code))));
  68. return RespBean.success("验证码发送成功");
  69. }
  70. }

7. 编写Controller层API接口

  1. @Api(tags = "admin-controller")
  2. @RestController
  3. @RequestMapping("/user")
  4. public class AdminController {
  5. @Autowired
  6. AuthServiceImpl authService;
  7. @ApiOperation(value = "发送邮箱验证码")
  8. @PostMapping("/getemailcode")
  9. public RespBean getEmailCode(@RequestParam String email) {
  10. return authService.sendMailCode(email);
  11. }
  12. @ApiOperation(value = "注册")
  13. @PostMapping("/register")
  14. public RespBean register(@RequestBody AuthUserDto authUserDto) {
  15. return authService.register(authUserDto);
  16. }
  17. }

根据原项目完善用户服务类(adminService)相关的方法实现,即可实现邮箱验证码注册功能。

三、结果演示

1. 发送邮箱验证码接口

  • 请求方式:post

  • 请求地址:/user/getemailcode

  • 参数:

    1. {
    2. "email": "XXXX@foxmail.com"
    3. }

2. 注册账号接口

  • 请求方式:post

  • 请求地址:/user/register

  • 参数:

    1. {
    2. "code": "214941",
    3. "email": "XXXXXXX@foxmail.com",
    4. "password": "123",
    5. "username": "myself"
    6. }

3. 验证码邮件示例

 参考:手把手教你通过SpringBoot实现邮箱注册码验证_智慧zhuhuix的博客-CSDN博客_springboot实现邮箱注册icon-default.png?t=M4ADhttps://blog.csdn.net/jpgzhu/article/details/119533833

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/686368
推荐阅读
相关标签
  

闽ICP备14008679号