基于邮箱发送验证码的方式

》》文章末尾有demo的git地址供下载参考

实现思路

  1. 用户点击忘记密码
  2. 用户输入用户名以及邮箱,点击获取验证码
  3. 后端校验用户名以及邮箱,正确后生成验证码
  4. 生成的验证码作为value,前缀加用户名为key,放入redis中并设置过期时间
  5. 用户输入验证码以及新的密码点击保存
  6. 后端通过前缀+用户名获取验证码,校验验证码的正确性
  7. 密码修改成功

前端UI页面

图为ProcessOn所画,可作为借鉴。也可设计为先验证用户名然后再进入改密码页面。

发件邮箱要求

作者使用的是163邮箱(其他邮箱也基本一致),需要设置POP3/SMTP/IMAP

开启

  • IMAP/SMTP服务
  • POP3/SMTP服务
    开启会让设置授权码,授权码要记牢!后面需要写在配置里

再往下翻有163 SMTP服务器地址 等下需要配置在application.yml中

各家邮箱大同小异,企业邮箱的话应该是可以直接用的,不用开启。

代码实现

1. 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2. application.yml配置

# 配置邮箱服务器,账号密码等
spring:mail:host: smtp.163.comusername: xxxxxx@163.compassword: ERBDGXLVJAQMWMDI(授权码)

3. 获取验证码controller

import com.clisoft.srmsbackend.common.response.ServerResponse;
import com.clisoft.srmsbackend.service.IMailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 邮箱业务 前端控制器* @author zzw* @date 2022-01-14*/
@Api(tags = "邮箱业务管理")
@RestController
@RequestMapping("/mail")
public class MailController {@Autowiredprivate IMailService mailService;/*** 获取重置密码的验证码*/@ApiOperation(value = "获取重置密码的验证码", notes = "获取重置密码的验证码", httpMethod = "GET")@ApiImplicitParams({@ApiImplicitParam(name = "staffNumber", value = "用户编号(账号)", required = true, paramType = "form"),@ApiImplicitParam(name = "mailAddress", value = "邮箱地址", required = true, paramType = "form"),})@GetMapping("/getCode")public ServerResponse getCode(String staffNumber,String mailAddress){return mailService.getCode(staffNumber,mailAddress);}
}

4. ServiceImpl层

import com.clisoft.srmsbackend.common.constant.Constants;
import com.clisoft.srmsbackend.common.response.ServerResponse;
import com.clisoft.srmsbackend.config.MailCodeConfig;
import com.clisoft.srmsbackend.dao.entity.PersStaff;
import com.clisoft.srmsbackend.dao.mapper.PersStaffMapper;
import com.clisoft.srmsbackend.framework.redis.RedisCache;
import com.clisoft.srmsbackend.service.IMailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Random;
import java.util.concurrent.TimeUnit;/*** 邮箱业务 实现类** @author zzw* @date 2022-01-14*/
@Service
public class MailServiceImpl implements IMailService {@Autowiredprivate PersStaffMapper persStaffMapper;@Autowiredprivate MailCodeConfig mailCodeConfig;@Autowiredprivate RedisCache redisCache;@Autowiredprivate JavaMailSender mailSender;@Value("${spring.mail.username}")private String mailUserName;/*** 获取重置密码的验证码** @param staffNumber 用户账号* @param mailAddress 用户邮箱* @return*/@Overridepublic ServerResponse getCode(String staffNumber, String mailAddress) {// 非空校验if (null == staffNumber || "".equals(staffNumber)) return ServerResponse.createByErrorMessage("账号不能为空!");if (null == mailAddress || "".equals(mailAddress)) return ServerResponse.createByErrorMessage("邮箱不能为空!");// 账号存在校验PersStaff persStaff = persStaffMapper.selectPersStaffByStaffNumber(staffNumber);if (null == persStaff) return ServerResponse.createBySuccessMessage("账号不存在!");if (!persStaff.getEmail().equals(mailAddress)) return ServerResponse.createByErrorMessage("输入邮箱和预留邮箱不一致!");String verifyCode = redisCache.getCacheObject(Constants.MAIL_CODE_KEY + staffNumber);if (verifyCode == null) {verifyCode = String.valueOf(new Random().nextInt(899999) + 100000);//生成短信验证码}Integer overtime = mailCodeConfig.getOvertime(); // 过期时间// 验证码存入redis并设置过期时间redisCache.setCacheObject(Constants.MAIL_CODE_KEY + staffNumber, verifyCode, overtime, TimeUnit.MINUTES);// 编写邮箱内容StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("<html><head><title></title></head><body>");stringBuilder.append("您好<br/>");stringBuilder.append("您的验证码是:").append(verifyCode).append("<br/>");stringBuilder.append("您可以复制此验证码并返回至科研管理系统找回密码页面,以验证您的邮箱。<br/>");stringBuilder.append("此验证码只能使用一次,在");stringBuilder.append(overtime.toString());stringBuilder.append("分钟内有效。验证成功则自动失效。<br/>");stringBuilder.append("如果您没有进行上述操作,请忽略此邮件。");MimeMessage mimeMessage = mailSender.createMimeMessage();// 发件配置并发送邮件try {MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);//这里只是设置username 并没有设置host和password,因为host和password在springboot启动创建JavaMailSender实例的时候已经读取了mimeMessageHelper.setFrom(mailUserName);// 用户的邮箱地址mimeMessageHelper.setTo(mailAddress);// 邮件的标题mimeMessage.setSubject("邮箱验证-科研管理系统");// 上面所拼接的邮件内容mimeMessageHelper.setText(stringBuilder.toString(), true);mailSender.send(mimeMessage);} catch (MessagingException e) {e.printStackTrace();}return ServerResponse.createBySuccessMessage("获取验证码成功,请查看移步您的邮箱" + mailAddress + "查看验证码!");}
}

5. 修改密码controller

/*** 验证码重置密码*/@ApiOperation(value = "验证码重置密码", notes = "验证码重置密码", httpMethod = "POST")@PostMapping("/codeUpdatePwd")public ServerResponse codeUpdatePwd(@RequestBody CodeUpdatePwdVo codeUpdatePwdVo){return persStaffService.codeUpdatePwd(codeUpdatePwdVo);}

6. 修改密码ServiceImpl

 /*** 验证码重置密码** @param codeUpdatePwdVo* @return*/@Overridepublic ServerResponse codeUpdatePwd(CodeUpdatePwdVo codeUpdatePwdVo) {String staffNumber = codeUpdatePwdVo.getStaffNumber();String code = codeUpdatePwdVo.getCode();String loginPassword = codeUpdatePwdVo.getLoginPassword();// 非空校验if (null == staffNumber || "".equals(staffNumber)) return ServerResponse.createByErrorMessage("账号不能为空!");if (null == code || "".equals(code)) return ServerResponse.createByErrorMessage("验证码不能为空!");if (null == loginPassword || "".equals(loginPassword)) return ServerResponse.createByErrorMessage("密码不能为空!");// 账号存在校验PersStaff persStaff = persStaffMapper.selectPersStaffByStaffNumber(staffNumber);if (null == persStaff) return ServerResponse.createBySuccessMessage("账号不存在!");// 验证码过期校验String cacheCode = redisCache.getCacheObject(Constants.MAIL_CODE_KEY + staffNumber); // 获取缓存中该账号的验证码if (cacheCode == null) {return ServerResponse.createByErrorMessage("验证码已过期,请重新获取!");}// 验证码正确性校验if (!cacheCode.equals(code)) {return ServerResponse.createByErrorMessage("验证码错误!");}// 修改密码int result = 0;try {result = persStaffMapper.updatePwdByStaffNumber(staffNumber, PasswordStorageUtil.createHash(codeUpdatePwdVo.getLoginPassword()));} catch (PasswordStorageUtil.CannotPerformOperationException e) {return ServerResponse.createByErrorMessage("密码加密时发生错误");}if (result > 0) {// 将验证码过期redisCache.expire(Constants.MAIL_CODE_KEY + staffNumber, 0);return ServerResponse.createBySuccessMessage("密码充值成功!请牢记您的密码!");}return ServerResponse.createByErrorMessage("未知错误,密码修改失败,请重试!");}

7. 效果图

8. 问题

  • 作者没有遇到什么问题,如有问题可留言讨论。

demo地址:https://gitee.com/lm_8692769/email-reset-password-demo

备注:此文章从本人博客园转移而来,本人博客园地址:https://www.cnblogs.com/equals

基于SpringBoot实现邮箱找回密码相关推荐

  1. java 基于springboot邮箱找回密码功能

    一.主要内容 基于springboot实现密码找回功能. 二.邮箱找回密码的思想. 1.输入注册邮箱,点击获取验证码.会将验证码发送到邮箱. 2.用户进入邮箱,查看验证码. 3.用户输入验证码,输入新 ...

  2. SpringBoot实现通过邮箱找回密码功能

    养成习惯,先赞后看!!! 目录 1.前言 2.步骤 2.1导入依赖 2.2开启邮箱的SMTP服务 2.3配置application.yaml文件 2.4 编写逻辑的步骤 2.4.1创建pm_valid ...

  3. AspNetCore-MVC实战系列(二)之通过绑定邮箱找回密码

    AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . git源码:https://github.com/shenniubuxing3/LovePicture.Web . AspNetC ...

  4. java邮箱找回密码_Spring实现简单的邮箱找回密码功能

    通过spring可以实现简单的邮箱找回密码的功能,在此做一下简单的笔记. 1.首先就是导入一些相关的jar包 2.加入配置文件,具体配置信息如下: encoding="UTF-8" ...

  5. java 邮箱找回密码_【JavaWeb】通过邮件找回密码

    前言 本文将介绍忘记密码时通过发送重置密码邮件找回密码的实现思路.整个实现过程中最重要的就是以下三点: 如何发送邮件到用户指定邮箱 邮件中的重置密码链接构成是怎么样的 验证重置密码链接的合法性(是否过 ...

  6. JavaWeb QQ邮箱找回密码

    我的上一篇博客,已经写了登录注册,接下来写QQ邮箱找回密码 首先:我们需要在 QQ邮箱设置中获取授权码,步骤如下 进入QQ邮箱---->设置---->账户---->开启服务:POP3 ...

  7. js加mysql写邮箱找回密码_邮箱找回密码实现

    邮箱找回密码实现 思路: 点击邮箱找回:前端给后端服务器发送请求 get:http://127.0.0.1:8000/api/v1/email?email=7777777777@qq.com 后端发送 ...

  8. laravel邮箱找回密码

    本文目录 一.邮箱找回密码 1.1 创建中间件 1.2 路由 1.3 控制器 1.4 测试效果 一.邮箱找回密码 1.1 创建中间件 创建一个验证邮箱验证码是否正确的中间件: 运行命令:php art ...

  9. 安卓APP登录忘记密码以及通过邮箱找回密码的实现

    本文章主要实现的是APP端点击忘记密码之后,服务器将自动发送密码给APP. 需要做的事有: 1.java发送邮件需要的jar包: 2.在qq邮箱开通IMAP/SMTP服务,并生成授权码 3.编写邮件工 ...

最新文章

  1. nChain首席科学家CSW:闪电网络会把BCE变成空洞的幽灵
  2. Java6.0中Comparable接口与Comparator接口详解
  3. 74. Leetcode 501. 二叉搜索树中的众数 (二叉搜索树-中序遍历类)
  4. VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)
  5. LINQ to XML .Net 3.5 中的新XML对象
  6. 下一代编解码标准的抉择
  7. Spark _03RDD_Transformations_Action_使用scalajavaAPI
  8. clion 快捷键_Ctrl+Shift系列快捷键的16个应用技巧都不掌握,那就真的Out了
  9. 关于 SAP Spartacus 的 Theme 颜色主题
  10. vue项目创建,redis列表字典操作,django用redis的第二种方法
  11. 吴恩达深度学习 —— 4.5 搭建深层神经网络块
  12. 百度鹰眼html打开,BMap:WEB 服务API
  13. java treemap lastkey,java.util.TreeMap.higherKey()方法实例
  14. [原创]全球首款不使用ViewState的Asp.Net2.0控件库
  15. 用C语言实现猜单词的小游戏
  16. 前后端python简单模拟api接口返回json,以及采集数据
  17. 计算机读不出光盘,光驱读不出光盘,小编教你电脑光盘不能被识别怎么解决
  18. 用python处理蛋白质互作信息
  19. Web3 – The Decentralized Web
  20. 阿肯色大学计算机,阿肯色大学怎么样?

热门文章

  1. 蓝色音箱改装电源_神改装:用小度音箱改装DIY音频AUX口,结局是大跌眼镜
  2. STM32用ST-link下载程序
  3. uniapp开发微信小程序,开发者工具、真机预览都没问题,唯独预览、体验版在手机上列表顺序错乱,用的localeCompare做的中文排序,终于找到问题并解决掉了,记录一下子
  4. 怎么使用百度更精准搜索?我来教你6个搜索引擎小技巧
  5. 密钥可以永久激活吗?
  6. ios animation 动画效果实现
  7. aspose.slides-15.9.0 将ppt转为pdf,去除水印
  8. oracle安装点下一步退出,学习笔记:oracle之win10安装卸载oracle 11gR2步骤及常见问题解决...
  9. AD9361参数设置总结
  10. openlayers2.13 地图绘点[点可以拖动,并且实时更新后台数据],测距同时更新数据到数据库