SpringBoot实现邮箱注册

功能说明

在BuaaMap的产品设计中,综合考虑安全性、易用性等,用户需以自己的邮箱为唯一标识注册账户。因此,后端必须支持邮箱发送、验证功能来实现这一需求。

具体来说,用户在注册我们产品的账号时,需要经过以下流程:

  1. 输入待注册且未在产品中注册过的账号
  2. 点击发送验证码按钮,获取系统发送给指定邮箱的验证码
  3. 输入正确的验证码,点击注册按钮完成注册

在该流程中,后端参与的部分有发送验证码,和处理注册请求时验证码验证

功能实现

整个邮箱模块实现分为两部分:邮箱Util类、Service类的实现与验证码存储、验证。

我的设计思路是Service提供邮件发送功能,而对于项目本身来说,Util调用Service发送具体场景下的验证码邮件。发送验证码后,后端在Redis缓存中存储<邮箱,验证码>的键值对,便于在注册时获取验证码信息用于验证,且该验证码具有“寿命”,超过一定时间后验证码会失效,需要重新获取验证码。

值得高兴的是,对于SpringBoot这样一个集成度高的框架,有各种工具包来大幅简化项目场景里的实现难度。

  1. 引入maven依赖

对于邮件发送功能,需要在pom.xml中引入如下依赖:

<dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

这里的javax.mail是最新版,可以适配与项目使用的SpringBoot最新版本。其他项目实际使用时需注意选择合适的版本。

  1. 选择用于发送邮件的邮箱

我们自然需要一个邮箱来给用户发送验证码。综合考虑网易邮箱在国内的普及度(其实是因为可以免费使用SMTP服务),我们决定注册一个网易邮箱账号用于承担此重任。

注册完成后,我们就拥有了一个邮箱账号!(x)

接下来,我们需要考虑如何用这个邮箱在后端自动在请求到来时给用户发送邮件。

一般来说,一台服务器使用邮件发送功能需要使用SMTP。

  • 什么是SMTP (Simple Mail Transfer Protocol)?

    SMTP (Simple Mail Transfer Protocol) is a TCP/IP protocol used in sending and receiving email. SMTP is used most commonly by email clients.

  • 为什么选择SMPT?

    直接发送邮件可能会遇到一些问题,例如邮件可能会被拦截或丢失,或者被识别为垃圾邮件。使用SMTP服务来发送邮件可以确保邮件的可靠传输,提高邮件的安全性和隐私性,并避免遇到与直接发送邮件相关的问题。

网易邮箱也提供了SMPT服务,需要手动开启获得使用密码。

首先在主页点击设置:

然后开启SMTP服务(IMAP,POP3是客户端收取邮件的协议,对我们的使用来说任选一个即可)

开启服务会展示SMTP服务密码,该密码在后续利用该账号发送邮件授权时需要使用。

注意,密码只会展示一次,之后便无法再在网易邮箱中获得该明文密码,因此需要及时保存。

  1. SpringBoot中配置相关变量

利用javax.mail工具包发送邮件时可以选择是否开启SSL,若不开启,邮件内容以明文传输,而开启后则会加密。若使用SSL则端口应使用465,否则使用默认的25即可。

spring:mail:username: buaamap@163.comemail: buaamap@163.compassword: xxxxxxxxhost: smtp.163.comport: 465properties:mail:smtp:starttls:enable: trueauth: truessl:enable: truesocketFactoryClass: javax.net.ssl.SSLSocketFactorydebug: true
  1. 发送邮件代码编写

具体功能代码实现如下,难以理解的部分在代码找中都附有注释:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Email {// 发送对象,可以有多个private List<String> tos;// 邮件主题private String subject;// 邮件内容private String content;
}
@Service
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;public void send(Email email) {if (this.email == null|| this.host == null|| this.port == null|| this.username == null|| this.password == null) {throw new RuntimeException("邮箱配置异常");}// 设置用于发送邮件的对象的信息MailAccount account = new MailAccount();account.setHost(this.host);account.setPort(Integer.parseInt(this.port));// 设置发送人邮箱account.setFrom(this.email);// 设置发送人名称account.setUser(this.username);// 设置发送授权码account.setPass(this.password);account.setAuth(true);// ssl方式发送account.setSslEnable(true);// 使用安全连接account.setStarttlsEnable(true);try {int size = email.getTos().size();Mail.create(account).setTos(email.getTos().toArray(new String[size])).setTitle(email.getSubject()).setContent(email.getContent()).setHtml(true)//关闭session.setUseGlobalSession(false).send();} catch (Exception e) {throw new RuntimeException(e.getMessage());}}
}

邮件发送的内容自然不能是单纯6个数字组成的验证码,为了美观可以发送“模板”。邮件发送模板需要使用到hutool工具包,但这部分不是本文的重点内容,因此不展开介绍,感兴趣的话可以上网搜索相关内容。

@Component
public class EmailUtil {@Autowiredprivate EmailService emailService;public void sendEmail(String email, String code) {// 获取发送邮箱验证码的HTML模板TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH));Template template = engine.getTemplate("emailTemplate.html");// 发送验证码emailService.send(new Email(Collections.singletonList(email),"邮箱验证码", template.render(Dict.create().set("code", code))));}
}
  1. 编写业务层面的验证码发送与验证功能
public void sendMailCode(String email) {// 首先判断邮箱是否被注册if (userService.findUserByEmail(email).size() != 0) {throw new RuntimeException("邮箱已被注册");}// 判断之前是否String code = redisUtil.get(email);if (code == null) {// 缓存中不存在验证码,则产生6位随机数作为验证码code = RandomUtil.randomNumbers(6);}// 发送邮件emailUtil.sendEmail(email, code);// 将<邮箱,验证码>键值对插入Redisif (!redisUtil.set(email, code, expiration)) {throw new RuntimeException("服务器redis缓存异常");}}public boolean register(RegisterInfo info) {...// 获取Redis里存储的验证码,与用户填写的验证码对比String actualCode = redisUtil.get(info.getEmail());if (actualCode == null) {throw new RuntimeException("验证码不存在");}if (!actualCode.equals(info.getEmailCode())) {throw new RuntimeException("邮箱验证码错误");}...
}

功能测试

编写发送验证码与注册的路由,在ApiFox里验证以上功能是否能正确执行。

发送邮箱失败—重复注册

发送成功

Redis数据库里出现对应键值对:

注册失败—验证码错误

注册失败—未发送验证码

注册成功

贡献者:李治圻-后端

SpringBoot实现邮箱注册相关推荐

  1. java springboot mybaits 邮箱注册实现

    随着科技发展.注册安全性,可靠性已成为服务器厂家关注的内容. 注册可以通过邮箱注册,也可以通过手机注册. 注册需要确认是本人,那么邮箱和手机验证成为关键. 今天写一下实现邮箱注册的步骤: 1.简单前端 ...

  2. SpringBoot利用邮箱注册(发送验证码)

    使用邮箱发送验证码功能 提示:本人用的是QQ邮箱,其他邮箱方式类似 文章目录 使用邮箱发送验证码功能 一.开启POP3/SMTP服务 1.进入QQ邮箱,点击设置 2.选中账户 3.然后一直往下划,找到 ...

  3. 使用SpringBoot实现邮箱注册

    1.编写serviceImpl实现类.(这个类主要编写发送短信) @ResourceJavaMailSender mailSender;//发送邮件对象public void sendActivati ...

  4. SpringBoot实现QQ邮箱注册和登录

    1.登录注册思路 1.1.思路 1.2.整个项目结构图 2.准备 2.1.开启邮箱POP3/SMTP服务 2.2.创建一个spring boot项目的时候,一直确认,jdk选择8. 2.3.appli ...

  5. SpringBoot 实现 QQ邮箱注册和登录

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 关注订阅号「程序员小乐」,收看更多精彩内容 每日英文 Memories, b ...

  6. SpringBoot 实现 QQ 邮箱注册和登录

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 ...

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

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

  8. java qq邮箱登录_SpringBoot实现QQ邮箱注册和登录

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

  9. SpringBoot集成邮箱功能并使用Knife4j测试

    SpringBoot集成邮箱功能并使用Knife4j测试 哔哩哔哩链接:https://www.bilibili.com/video/BV1uA411N7cm 1.获取163或QQ邮箱授权码 163邮 ...

最新文章

  1. 微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
  2. 面试集锦(十六)架构设计
  3. 《Algorithm算法》笔记:元素排序(2)——希尔排序
  4. 浅谈Java锁,与JUC的常用类,集合安全类,常用辅助类,读写锁,阻塞队列,线程池,ForkJoin,volatile,单例模式不安全,CAS,各种锁
  5. springboot集成rocketmq生产者
  6. 【ES】分布式调度系统之 Elastic-Job-Lite
  7. c语言程序设计小学生测验,c语言程序设计(1) 小学生计算机辅助教学系统
  8. gz 解压 linux_Linux-Ubuntu常用命令-03-压缩解压
  9. linux命令 bind,Linux bind命令
  10. 深度学习自学(十七):caffe-sphereface-编译matcaffe遇到的问题
  11. 教你10分钟电脑配置挑选装机速成攻略
  12. 学习PerfDog安卓(Android)APP的性能测试(1)
  13. 原版XP合集,非BT下载
  14. 龙族幻想最新东京机器人位置_龙族幻想藤原智坐标位置一览 藤原智任务攻略...
  15. CSDN《原力计划—打卡挑战》为你而来,新升级, 多流量,抓住春季的小尾巴,冲冲冲!
  16. 威力曲面sw2020_威力曲面插件(SolidWorks曲面设计助手)V6.1 正式版
  17. 那是计算机房吗英语否定回答,【微课+教材+听力+知识点】PEP四年级英语下册 Unit 1...
  18. 开Lotus notes后,单击“邮件”,打不开邮箱,弹出“远程服务器不是已知的TCP/IP”报错
  19. C语言实现网页版扫雷
  20. 解决ORA--27100 shared memory realm already exists报错

热门文章

  1. 记录VITE Vue3开发需要的一些常用插件
  2. 碰到困难,心情有点沉重
  3. 用leaflet做地图数据分析与可视化
  4. 考研数学-系统几何2主讲人:孙华明-2020年08月09日
  5. JS 国际象棋64格。第一个放一粒,后面每一格都放上一格的2倍。问第64个格上会放多少粒米?
  6. html video 修改封面,html5的video的封面poster图片填充
  7. 三国志威力无双物资如何获取?
  8. 玩转「Wi-Fi」系列之应用程序(五)
  9. 上不了北大“图灵”、清华“姚班”,AI专业还能去哪上?
  10. HTML+CSS+JS——龙之谷网络游戏(9页) 学生网游网页设计模板 大学生HTML网页制作作品 简单手游网页设计成品 dreamweaver学生网站模板