1、准备工作

  • 我们需要前往我们的QQ邮箱开启相关功能,登录QQ邮箱后,点击进入 设置

在账户在一栏中,我们可以找到这个界面,然后点击开启 POP3/SMTP服务 ,他们会让我们用QQ的密保手机发送一条短信,我们照着即可。

验证成功之后,会获得一个授权码,当我们在第三方客户端登录QQ邮箱时,这个授权码就是我们邮箱的登录密码。

         将授权码复制之后,点击确定,我们可以看到 POP3/SMTP服务 已经开启

到此,我们的QQ邮箱方面的准备工作就完成了。

  • 导入相关依赖
        <!--qq邮箱--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.5.6</version></dependency>
  • 编写spring boot配置文件

在 application.properties  配置文件中写入一下代码

# 配置邮箱用户名
spring.mail.username=  你的QQ邮箱号码
# 配置申请到的授权码
spring.mail.password=刚才短信申请到的授权码
# 配置 smtp 服务器地址
spring.mail.host=smtp.qq.com
#
spring.mail.properties.mail.smtp.ssl.enable=true
# 配置邮件编码
spring.mail.default-encoding=UTF-8
  • 话不多说,先测试一波,看我们的准备工作是否准备成功

在spring boot的测试类中,通过 JavaMailSenderImpl 这个对象的 send 方法发送邮件

@SpringBootTest
class SpringbootLoginDemo1ApplicationTests {@AutowiredJavaMailSenderImpl mailSender;    //自动注入对象@Testvoid contextLoads() {//一个简单的邮件发送SimpleMailMessage mailMessage = new SimpleMailMessage(); //创建一个邮件信息System.out.println("当前时间" + new Date());mailMessage.setSubject("你好啊");                        //邮件的主题mailMessage.setText("我是你新学习的Spring Boot邮件发送的知识");//邮件的内容mailMessage.setTo("发送者的邮箱");                        //发送者的邮箱mailMessage.setFrom("接受者的邮箱");                      //接收者的邮箱//我这里发送者和接收者都填写的是自己的邮箱mailSender.send(mailMessage);                                //发送邮件}}

点击运行的小按钮,让我们来测试一下吧。

yes,运行成功,成功收到邮件!!!

2、编写发送邮件的接口

在接口类上定义一个HashMap,用来存储。

private Map<String, Object> resultMap = new HashMap<>();
  • 我们正在编写发送邮件的接口,那么首先,我们想通过邮件来发送什么信息呢?肯定是验证码啊,所以我们需要写一个方法,来生产我们的验证码。如下:
 private String VerifyCode(int n){  // n的作用就是指定验证码的长度Random r = new Random(); //创建一个生成随机数的对象StringBuffer sb =new StringBuffer(); // StringBuffer是一种可变的字符串,长度、内容都可变for(int i = 0;i < n;i ++){    //一个for循环int ran1 = r.nextInt(10);//生成一个大于0小于10的随机数sb.append(String.valueOf(ran1));//调用append方法将我们生成的随机数存放到StringBuffer对象sb中}System.out.println(sb);return sb.toString();      //将sb以String的形式输出}

这样,我们的验证码生成这一功能就完成了,但是大家想一想,验证码肯定是要进行保存,然后可以在注册时将我们后台保存的验证码与用户输入的验证码进行比对,从而判定用户输入的验证码是否正确,并且验证码也需要设置它的过期时间,这样才会更加合理。

  • 下面就开始发动多年的功力去实现这一功能吧。
//保存验证码和时间private void saveCode(String code){SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置时间的格式Calendar c = Calendar.getInstance();c.add(Calendar.MINUTE, 5);String currentTime = sf.format(c.getTime());// 生成5分钟后时间,用户校验是否过期String hash =  Md5Util.code(code);//生成MD5值    //对验证码进行md5加密resultMap.put("hash", hash);    //将加密后的验证码发到HashMap中resultMap.put("tamp", currentTime);  //将验证码保存的时间信息发到HashMap中}

相比大家应该已经注意到了,上面代码的 Md5Util 这个md5加密的工具类,我们并没有写,使用我们需要创建一个util包,用以存放我们的工具类,然后将 Md5Util  编写好。我就讲我们代码放在下面了。

public class Md5Util {/*** MD5加密类** @param str 要加密的字符串* @return 加密后的字符串*/public static String code(String str) {try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(str.getBytes());byte[] byteDigest = md.digest();int i;StringBuffer buf = new StringBuffer("");for (int offset = 0; offset < byteDigest.length; offset++) {i = byteDigest[offset];if (i < 0)i += 256;if (i < 16)buf.append("0");buf.append(Integer.toHexString(i));}//32位加密return buf.toString();// 16位的加密//return buf.toString().substring(8, 24);} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}
  • NEXT TO,接下来就是重头戏了。
@PostMapping("/sendEmail")@ApiOperation(value = "发送邮件验证码,前端需传email变量,并判断email是否是一个正确的邮箱号码")public Result<?> sendEmail(@RequestParam("userEmail")  @Validated String userEmail) {SimpleMailMessage message = new SimpleMailMessage();String code = VerifyCode(6);    //随机数生成6位验证码message.setFrom(sender);        //指定发送者的邮箱message.setTo(userEmail);       //接受者的邮箱,由用户输入message.setSubject("验证码");// 邮件标题message.setText("【验证码】你的验证码为:"+code+",有效时间为5分钟(若不是本人操作,可忽略该条邮件)");// 内容try {javaMailSender.send(message);    //发送邮件logger.info("文本邮件发送成功!");saveCode(code);                //邮件发送成功,将验证码保存return Result.success();}catch (MailSendException e){logger.error("目标邮箱不存在");    //抛出异常,用户邮箱不存在return Result.error(Constants.CODE_400 , "目标邮箱不存在");} catch (Exception e) {logger.error("文本邮件发送异常!", e);return Result.error(Constants.CODE_500 , "邮件发送异常"); //抛出异常,邮件发送失败}}
  • 用测试工具postman进行测试 。

nice,测试成功

3、注册接口编写

在编写一个接口前,我们先想一想我们需要哪些参数。既然时注册接口,那么我们应该需要注册用户的一些注册信息以及通过邮件发送的验证码。

    @PostMapping("/register")@ApiOperation(value = "用户注册")public Result<?> register(@RequestBody @Validated User user, @RequestParam String code){//@Validated验证数据是否合法user.setUserRole("vip1");//默认创建的都是普通用户if (StrUtil.isBlank(code)){return Result.error(Constants.CODE_400, "验证码为空");}User res = userService.getUserByUserNum(user.getUserNum());if (res != null) {return Result.error("-1", "账号重复");}System.out.println(user);if (StrUtil.isBlank(user.getUserNum())){return Result.error(Constants.CODE_400, "用户学号为空");}String requestHash = resultMap.get("hash").toString();//得到resultMap中的验证码String tamp = resultMap.get("tamp").toString();            //得到resultMap中的验证码创建时间SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//当前时间对象Calendar c = Calendar.getInstance();//得到当前时间System.out.println("当前的时间:::" + c);String currentTime = sf.format(c.getTime());//调用format方法将日期转换为文本System.out.println("将当前的时间转换为文本后的时间:currentTime::" + currentTime);System.out.println( " 时间比较 "+ tamp.compareTo(currentTime));if (tamp.compareTo(currentTime) > 0) {  //调用compareTo方法,比较字符串String hash =  Md5Util.code(code);//生成MD5值if (hash.equalsIgnoreCase(requestHash)){//校验成功User userInfo = User.builder().id(user.getId()).userName(user.getUserName()).userNum(user.getUserNum()).userPassword(new BCryptPasswordEncoder().encode(user.getUserPassword()))//加密.userInfo(user.getUserInfo()).userEmail(user.getUserEmail()).userPhone(user.getUserPhone()).userRole(user.getUserRole()).build();userService.insert(userInfo);return Result.success();}else {//验证码不正确,校验失败return Result.error(Constants.CODE_400, "验证码错误");}} else {// 超时return Result.error(Constants.CODE_600, "验证码超时");}}
  • 这样,我们的一个邮件发送跟注册接口就完成了,接下来就是验证环节了。

接受到邮件,获取验证码。

填写验证码以及用户的注册信息。

结果返回为成功!!!

接下来就让我们去数据库中看看我们刚刚注册的用户是否存在吧。

yes,成功实现。

好了,话不多说,下班了。

Spring Boot实现QQ邮件发送,用户注册功能——前后端分离版相关推荐

  1. 视频教程-Vue、Spring Boot开发小而完整的Web前后端分离项目实战-Java

    Vue.Spring Boot开发小而完整的Web前后端分离项目实战 3年多.net开发经验:5年的java后端开发经验,熟悉行.net,java流行技术,拥有多个.net,java web企业级应; ...

  2. springboot web项目_Vue、Spring Boot开发小而完整的Web前后端分离项目实战12

    第12讲 tabs选项卡制作讲解 1.1.tabs选项卡组件: 1. tabs 组件 2.常用属性: value :选中选项卡的name type :选项卡风格 可选择 card / border-c ...

  3. vue项目开发实战案例_Vue、Spring Boot开发小而完整的Web前后端分离项目实战02

    第02讲 前端项目工具安装及环境搭建 1.1.开发工具:visual studio code 1.1.visual studio code 官网下载地址 https://code.visualstud ...

  4. 基于Spring Boot技术栈博客系统企业级前后端实战之课程导论(零)

    零.说明(必读) 一.课程概述 1.1 名称 1.2 功能 1.3 技术点 1.4 目标 二.核心功能 2.1 用户管理 2.2 安全设置 2.3 博客管理 2.4 评论管理 2.5 点赞管理 2.6 ...

  5. Vue + Spring Boot 项目实战(三):前后端结合测试(登录页面开发)

    前面我们已经完成了前端项目 DEMO 的构建,这一篇文章主要目的如下: 一.打通前后端之间的联系,为接下来的开发打下基础 二.登录页面的开发(无数据库情况下) 本篇目录 前言:关于开发环境 一.后端项 ...

  6. Vue + Spring Boot 项目实战(四):前后端结合测试(登录页面开发)

    前面我们已经完成了前端项目 DEMO 的构建,这一篇文章主要目的如下: ①打通前后端之间的联系,为接下来的开发打下基础 ②登录页面的开发(无数据库情况下) 文章目录 一.后端项目创建 1.1. 项目/ ...

  7. spring boot + vue + element-ui全栈开发入门——前后端整合开发

    一.配置 思路是通过node的跨域配置来调用spring boot的rest api. 修改config\index.js文件,设置跨域配置proxyTable: proxyTable: {'/api ...

  8. 使用阿里云的短信服务进行登录实现登录拦截的功能(前后端分离) ---- (Session存储验证码用户信息)

    使用阿里云的短信服务进行登录&实现登录拦截的功能(Session存储 开通短信服务 获取AccessKey 搭建前端环境 搭建后端环境 实体类 Dao层 业务层 控制层 配置类 工具类 开通短 ...

  9. eclipse实现MySQL分页的类_JavaWeb案例(MVC+MySQL+分页功能)+前后端分离

    具备的测试工具:Eclipse,MySQL数据库,HBuilder,jstl1.2jar,mysql.connector.java.8.0.jar jstl1.2jar下载地址:https://pan ...

  10. Java Spring boot element ui activiti前后端分离,流程审批,权限管理框架

    基于react ant design pro typescript 技术框架已经重磅推出 预览地址 系统介绍 是什么? 使用springboot,activiti,mybatis,vue elemen ...

最新文章

  1. OpenCV | 二值图像分析的技巧都在这里
  2. 西数硬盘固件刷新工具_鲁大师Q2季度硬盘排行:三星、西数上榜产品最多
  3. 第十六届智能车竞赛参赛队伍提问-6-11
  4. 2016年光伏系统成本将持续下降
  5. lazada本地店怎么开通,需要什么条件?
  6. 11WinDlg 对话框一
  7. Spring3+ibatis (SQL Server)+pager-taglib.tld查询分页的实现
  8. linux下多种锁的比较
  9. C++---两数之和
  10. 获取计算机内存镜像文件,计算机取证中的内存镜像获取的研究与实现
  11. 数据结构之栈的应用:括号匹配问题
  12. Leetcode算法题(C语言)6--只出现一次的数字
  13. mysql循环map_java Map 遍历速度最优解
  14. HIVE高级函数--get_json_object()和json_tuple()
  15. 2个Python入门级的实战项目
  16. 基于Matlab数字图像处理微表情情绪识别系统
  17. 星星之火-57:前传接口 CPRI的速率、能力、小区带宽之间的映射关系
  18. QSS设置字体透明度
  19. Math数学对象(万能随机数公式)
  20. vue3源码effect

热门文章

  1. mysql 执行存储过程
  2. Office之word如何去除尾注的横线?
  3. 如何注册域名邮箱?个人域名邮箱怎么弄?域名邮箱登录入口?
  4. win10安装visio2010出错_四种解决安装Office 2010时出现错误1907的提示方法介绍
  5. 2年前端 杭州 面试 集合 面经 前端
  6. 51单片机:编程实现数码管显示0~999999的秒表计时,高位的0不显示。
  7. PPT的默认设置以及快捷键的使用(超级实用的PPT操作)
  8. 长截图或长图片如何按页面切分后打印或插入到Word文档中
  9. 脉冲宽度调制pdm_脉冲宽度调制,脉宽调制
  10. 华师大计算机在线测试,华东师大:180道心理测试题面试免费师范生