目录

一、简介

二、代码实现

1. 添加pom依赖

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

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

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

5. 创建邮件模板

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

7. 编写Controller层API接口

三、结果演示

1. 发送邮箱验证码接口

2. 注册账号接口

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


一、简介

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

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

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

二、代码实现

1. 添加pom依赖

    <!-- spring data redis 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- hutool工具包依赖--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.5.7</version></dependency><!--  mail依赖--><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version></dependency><!--  模板引擎依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class EmailDto {/*** 发送邮箱列表*/private List<String> tos;/*** 主题*/private String subject;/*** 内容*/private String content;}
@ApiModel(value = "授权用户信息")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AuthUserDto {@ApiModelProperty(value = "用户名")private String username;@ApiModelProperty(value = "密码")private String password;@ApiModelProperty(value = "临时登录凭证")private String code;@ApiModelProperty(value = "邮箱")private String email ;}

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

public interface EmailService {/*** 发送邮件** @param emailDto 邮箱列表*/void send(EmailDto emailDto);
}
@Service
@RequiredArgsConstructor
public class EmailServiceImpl implements EmailService {@Value("${spring.mail.email}")private String email;@Value("${spring.mail.host}")private String host;@Value("${spring.mail.port}")private String port;@Value("${spring.mail.username}")private String username;@Value("${spring.mail.password}")private String password;@Overridepublic void send(EmailDto emailDto) {// 读取邮箱配置if (email == null || host == null || port == null || username == null || password == null) {throw new RuntimeException("邮箱配置异常");}// 设置MailAccount account = new MailAccount();account.setHost(host);account.setPort(Integer.parseInt(port));// 设置发送人邮箱account.setFrom(username + "<" + email + ">");// 设置发送人名称account.setUser(username);// 设置发送授权码account.setPass(password);account.setAuth(true);// ssl方式发送account.setSslEnable(true);// 使用安全连接account.setStarttlsEnable(true);// 发送邮件try {int size = emailDto.getTos().size();Mail.create(account).setTos(emailDto.getTos().toArray(new String[size])).setTitle(emailDto.getSubject()).setContent(emailDto.getContent()).setHtml(true)//关闭session.setUseGlobalSession(false).send();} catch (Exception e) {throw new RuntimeException(e.getMessage());}}
}

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

mail:# 负责发送验证码的邮箱email: XXXX@126.comhost: smtp.126.comport: 465username: XXXX# 授权码是用于登录第三方邮件客户端的专用密码。password: XXXXXXXXX#邮箱验证码有效时间/秒
code:expiration: 300

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

5. 创建邮件模板

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><style>@page {margin: 0;}</style>
</head>
<body>
<div class="header"><div style="padding: 10px;padding-bottom: 0px;"><p style="margin-bottom: 10px;padding-bottom: 0px;">尊敬的用户,您好:</p><p style="text-indent: 2em; margin-bottom: 10px;">您正在注册【XXX平台】账号,您的验证码为:</p><p class="code-text">${code}</p><div class="footer"></div></div>
</div>
</body>
</html><style lang="css">body {margin: 0px;padding: 0px;font: 100% SimSun, Microsoft YaHei, Times New Roman, Verdana, Arial, Helvetica, sans-serif;color: #000;}.header {height: auto;width: 820px;min-width: 820px;margin: 0 auto;margin-top: 20px;border: 1px solid #eee;}.code-text {text-align: center;font-family: Times New Roman;font-size: 22px;color: #C60024;padding: 20px 0px;margin-bottom: 10px;font-weight: bold;background: #ebebeb;}.footer {margin: 0 auto;z-index: 111;width: 800px;margin-top: 30px;border-top: 1px solid #DA251D;}
</style>

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

public interface AuthService {/*** 向指定邮箱发送验证码** @param email 邮箱号* @return 结果*/RespBean sendMailCode(String email);/*** 注册** @param authUserDto 认证用户请求信息* @return 是否成功*/RespBean register(AuthUserDto authUserDto);
}

主要实现两个功能

  1. 向邮箱发送随机验证码;sendMailCode
  2. 收到用户输入验证码进行校验完成注册;register
@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class AuthServiceImpl implements AuthService {@Value("${code.expiration}")private Long expiration;//    private final IAdminService adminService;
//    private final RedisUtils redisUtils;private final EmailService emailService;private final PasswordEncoder passwordEncoder;@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Autowiredprivate AdminServiceImpl adminService;@Override@Transactional(rollbackFor = Exception.class)public RespBean register(AuthUserDto authUserDto) {ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();// 通过email获取redis中的codeObject value = valueOperations.get(authUserDto.getEmail());if (value == null || !value.toString().equals(authUserDto.getCode())) {return RespBean.error("无效验证码!");}// 如果前端没有传入用户名,则以邮箱号作为用户名进行注册String userName = StringUtils.isEmpty(authUserDto.getUsername()) ? authUserDto.getEmail() : authUserDto.getUsername();if (adminService.getAdminByUserName(userName) != null) {return RespBean.error("用户名已存在!");}// 创建用户Admin admin = new Admin();admin.setUsername(userName);try {admin.setPassword(passwordEncoder.encode(authUserDto.getPassword()));} catch (Exception e) {return RespBean.error("注册密码异常!");}admin.setEmail(authUserDto.getEmail());if(adminService.create(admin) == null){return RespBean.error("用户注册失败!");};redisTemplate.delete(authUserDto.getEmail());return RespBean.success("用户注册成功!");}@Overridepublic RespBean sendMailCode(String email) {ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();// 查看注册邮箱是否存在if (adminService.registerEmailExist(email)) {return RespBean.error("邮箱已被注册!");}// 获取发送邮箱验证码的HTML模板TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH));Template template = engine.getTemplate("email-code.ftl");// 从redis缓存中尝试获取验证码Object code = valueOperations.get(email);if (code == null) {// 如果在缓存中未获取到验证码,则产生6位随机数,放入缓存中code = RandomUtil.randomNumbers(6);try {valueOperations.set(email, code, expiration, TimeUnit.SECONDS);} catch (Exception e) {return RespBean.error("后台缓存服务异常");}}// 发送验证码emailService.send(new EmailDto(Collections.singletonList(email),"邮箱验证码", template.render(Dict.create().set("code", code))));return RespBean.success("验证码发送成功");}
}

7. 编写Controller层API接口

@Api(tags = "admin-controller")
@RestController
@RequestMapping("/user")
public class AdminController {@AutowiredAuthServiceImpl authService;@ApiOperation(value = "发送邮箱验证码")@PostMapping("/getemailcode")public RespBean getEmailCode(@RequestParam String email) {return authService.sendMailCode(email);}@ApiOperation(value = "注册")@PostMapping("/register")public RespBean register(@RequestBody AuthUserDto authUserDto) {return authService.register(authUserDto);}}

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

三、结果演示

1. 发送邮箱验证码接口

  • 请求方式:post

  • 请求地址:/user/getemailcode

  • 参数:

    { "email": "XXXX@foxmail.com"
    }

2. 注册账号接口

  • 请求方式:post

  • 请求地址:/user/register

  • 参数:

    {"code": "214941","email": "XXXXXXX@foxmail.com","password": "123","username": "myself"
    }

3. 验证码邮件示例

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

基于SpringBoot实现邮箱验证码注册相关推荐

  1. mysql查询使用qq邮箱注册_Spring Boot实现qq邮箱验证码注册和登录验证功能

    1.登录注册思路 这是一个使用spring boot做的一个qq邮箱注册和登录的项目. 没写前端页面,使用postman测试.有截图详细. 1.1.思路 注册:通过输入的邮箱发送验证码,检验前端传来的 ...

  2. 使用SpringBoot发送邮箱验证码

    使用SpringBoot发送邮箱验证码 一.开启发送验证码邮箱的POP3/SMTP服务 1. 登录发送验证码邮箱 2. 找到设置,开启POP3/SMTP服务 二.导入依赖 三.增加配置 四.编写代码 ...

  3. SpringBoot 发送邮箱验证码(HTML模板)

    在 Java 使用 JavaMailSenderImpl 实现发送 QQ 邮件 中详细的讲述了在普通 Java 项目中如何使用QQ邮箱发送邮件. 在本文中会继续详细的为大家讲解如何在 SpringBo ...

  4. SpringBoot实现邮箱验证码

    介绍 我们使用redis数据库保存临时的邮箱验证码信息 快速开始 1. 导入依赖 <!--mail邮件发送pom支持--> <dependency><groupId> ...

  5. 基于SpringBoot实现邮箱找回密码

    基于邮箱发送验证码的方式 >>文章末尾有demo的git地址供下载参考 实现思路 用户点击忘记密码 用户输入用户名以及邮箱,点击获取验证码 后端校验用户名以及邮箱,正确后生成验证码 生成的 ...

  6. 基于Springboot框架的登录注册页面

    今天正式开始第一篇文章创作,很高兴大家能够见证我的成长,也祝愿大家早日升职加薪哈. 首先声明,本人是技术小白,我只做我自己学习的总结.如果有技术上的错误,误导了大家,希望大家能及时做出补充指正. 下面 ...

  7. 基于Springboot搭配Captcha验证码使用心得

    介绍 google captcha 是google生成验证码的一个工具类,其原理是将随机生成字符串保存到session中,同时以图片的形式返回给页面,之后前台页面提交到后台进行对比. 使用方法 1.导 ...

  8. Java 使用邮箱进行注册验证

    1.Springboot 使用邮箱进行注册验证需要导入依赖,如果是Java项目则需要导入email.jar <!--email--> <dependency><group ...

  9. PHPMailer实现简单邮箱验证码

    00PHPMailer PHPMailer是一个非常强大的 php发送邮件类,可以设定发送邮件地址.回复地址.邮件主题.html网页,上传附件,并且使用起来非常方便. phpMailer 的特点: 1 ...

  10. 基于springboot实现注册功能发送激活码至邮箱激活账户登录

    文章目录 激活原理 运行说明(重点) 实例演示(重点) 代码说明 项目结构图 准备工作 emailactivate项目详细代码 common UUIDUtils config DruidDbConfi ...

最新文章

  1. S3C2440时钟体系结构
  2. springboot配置多个数据库环境
  3. 硬盘数据恢复经验(转)
  4. 这里有10个优质Python开源项目,来帮你学好Python
  5. 7.4 流水线的冒险
  6. 链式编程在Java 中的应用
  7. 我的2008,专注而行
  8. Ubuntu系统---C++之Eclipse IDE 编译器安装
  9. 如何在Win10安装“Siemens TIA Openness”
  10. 优化计算机组策略,Windows 10神州网信版优化
  11. c语言编译器中cu是什么意思,.c文件调用.cu中的函数
  12. 大数据分析未来财富管理谁会脱颖而出?
  13. http://blog.csdn.net/wrp920227/article/details/54588238
  14. 适合笔记本计算机玩的游戏,十款,笔记本电脑可以畅玩的单机游戏
  15. Linux查看进程运行的完整路径方法
  16. Codeforces Round #818 (Div. 2)
  17. 难免犯傻 难免一根筋啊
  18. BZOJ4899: 记忆的轮廓 期望DP 决策单调性
  19. jQuery页面刷新的一些方法
  20. 【计算机网络实验】单区域OSPF配置实验

热门文章

  1. html5类库,javascript类库有哪些?
  2. 静态库和动态库的区别
  3. 编写一个第三方库(动态库和静态库)
  4. 如何快速搜索文件和文件内容
  5. 回顾经典: AlexNet, CaffeNet — Winner of ILSVRC 2012
  6. 接口测试工具postman
  7. win10远程连接Ubuntu
  8. 关于Matlab插值的问题,这些应该够用了吧
  9. Python项目:爬取IT互联网高薪热门职位数据并进行可视化分析
  10. 贴片电容耐压和额定电压