基于SpringBoot实现邮箱验证码注册
目录
一、简介
二、代码实现
1. 添加pom依赖
2. 创建邮件发送信息传输类、授权信息类
3. 创建邮箱服务接口和实现类
4. 修改配置文件application.yml,添加相关配置信息
5. 创建邮件模板
6. 创建功能服务接口与实现类
7. 编写Controller层API接口
三、结果演示
1. 发送邮箱验证码接口
2. 注册账号接口
3. 验证码邮件示例编辑
一、简介
用户注册系统时,一般会以邮箱进行关联注册,需要用户输入邮箱地址以获取随机验证码,然后在注册页面输入该验证码并完善其他相关注册信息点击注册,完成注册。
基于SpringBoot的后端开发项目实现的逻辑分为两步:
- 向邮箱发送随机验证码;
- 收到用户输入验证码进行校验完成注册;
二、代码实现
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);
}
主要实现两个功能
- 向邮箱发送随机验证码;sendMailCode
- 收到用户输入验证码进行校验完成注册;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实现邮箱验证码注册相关推荐
- mysql查询使用qq邮箱注册_Spring Boot实现qq邮箱验证码注册和登录验证功能
1.登录注册思路 这是一个使用spring boot做的一个qq邮箱注册和登录的项目. 没写前端页面,使用postman测试.有截图详细. 1.1.思路 注册:通过输入的邮箱发送验证码,检验前端传来的 ...
- 使用SpringBoot发送邮箱验证码
使用SpringBoot发送邮箱验证码 一.开启发送验证码邮箱的POP3/SMTP服务 1. 登录发送验证码邮箱 2. 找到设置,开启POP3/SMTP服务 二.导入依赖 三.增加配置 四.编写代码 ...
- SpringBoot 发送邮箱验证码(HTML模板)
在 Java 使用 JavaMailSenderImpl 实现发送 QQ 邮件 中详细的讲述了在普通 Java 项目中如何使用QQ邮箱发送邮件. 在本文中会继续详细的为大家讲解如何在 SpringBo ...
- SpringBoot实现邮箱验证码
介绍 我们使用redis数据库保存临时的邮箱验证码信息 快速开始 1. 导入依赖 <!--mail邮件发送pom支持--> <dependency><groupId> ...
- 基于SpringBoot实现邮箱找回密码
基于邮箱发送验证码的方式 >>文章末尾有demo的git地址供下载参考 实现思路 用户点击忘记密码 用户输入用户名以及邮箱,点击获取验证码 后端校验用户名以及邮箱,正确后生成验证码 生成的 ...
- 基于Springboot框架的登录注册页面
今天正式开始第一篇文章创作,很高兴大家能够见证我的成长,也祝愿大家早日升职加薪哈. 首先声明,本人是技术小白,我只做我自己学习的总结.如果有技术上的错误,误导了大家,希望大家能及时做出补充指正. 下面 ...
- 基于Springboot搭配Captcha验证码使用心得
介绍 google captcha 是google生成验证码的一个工具类,其原理是将随机生成字符串保存到session中,同时以图片的形式返回给页面,之后前台页面提交到后台进行对比. 使用方法 1.导 ...
- Java 使用邮箱进行注册验证
1.Springboot 使用邮箱进行注册验证需要导入依赖,如果是Java项目则需要导入email.jar <!--email--> <dependency><group ...
- PHPMailer实现简单邮箱验证码
00PHPMailer PHPMailer是一个非常强大的 php发送邮件类,可以设定发送邮件地址.回复地址.邮件主题.html网页,上传附件,并且使用起来非常方便. phpMailer 的特点: 1 ...
- 基于springboot实现注册功能发送激活码至邮箱激活账户登录
文章目录 激活原理 运行说明(重点) 实例演示(重点) 代码说明 项目结构图 准备工作 emailactivate项目详细代码 common UUIDUtils config DruidDbConfi ...
最新文章
- S3C2440时钟体系结构
- springboot配置多个数据库环境
- 硬盘数据恢复经验(转)
- 这里有10个优质Python开源项目,来帮你学好Python
- 7.4 流水线的冒险
- 链式编程在Java 中的应用
- 我的2008,专注而行
- Ubuntu系统---C++之Eclipse IDE 编译器安装
- 如何在Win10安装“Siemens TIA Openness”
- 优化计算机组策略,Windows 10神州网信版优化
- c语言编译器中cu是什么意思,.c文件调用.cu中的函数
- 大数据分析未来财富管理谁会脱颖而出?
- http://blog.csdn.net/wrp920227/article/details/54588238
- 适合笔记本计算机玩的游戏,十款,笔记本电脑可以畅玩的单机游戏
- Linux查看进程运行的完整路径方法
- Codeforces Round #818 (Div. 2)
- 难免犯傻 难免一根筋啊
- BZOJ4899: 记忆的轮廓 期望DP 决策单调性
- jQuery页面刷新的一些方法
- 【计算机网络实验】单区域OSPF配置实验