JavaMailSender实现邮箱验证功能

作者:laozhang 时间:2022-05-11 12:32:59 

本文通过JavaMailSender实现邮箱注册验证中遇到的问题开始着手,给大家详细分析了其原理以及问题的解决办法。

使用邮箱注册验证,我们需要理清设计思路:

问题一:注册信息提交后需要对填写的邮箱号发送邮件

问题二:邮件到达时用户如何进行激活,是通过get请求还是获取验证码(本篇使用get接口激活)

问题三:邮件激活如何设置有效时间

通过以上三个问题,博主来帮助大家掌握JavaMailSender邮箱验证

问题一

我首先需要解决如何向指定邮箱号发送邮件

在pom中加入如下依赖:


<!--email-->
<dependency>
 <groupId>javax.mail</groupId>
 <artifactId>mail</artifactId>
 <version>1.4.7</version>
</dependency>

 

没错,我们使用javax拓展包下的mail依赖,所以代码中import别选错了

本篇代码一切从简,方便大家读懂

从上到下,我们先看接口:


@RequestMapping(value = "myajaxRegister")
 @ResponseBody
 public String sendEmail(@RequestParam String email){
   User user = new User("luxiaotao","0331");
   new Thread(){
     @Override
     public void run(){
       emailService.senEmail(user,email);
     }
   }.start();
   return "邮件已发送至您的邮箱,请激活";
 }

 

因为是测试,所以博主制造了用户的假数据,拿到email才是关键

新建线程来执行邮件发送方法是为了提高用户的体验

试想下如果不为异步,用户需要等待邮件发送完才能跳转页面

来看邮件发送的业务层方法:


@Override
 public boolean senEmail(User user,String email) {
   try {
     JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
     mailSender.setHost("smtp.163.com");
     mailSender.setUsername("填写自己的163邮箱账号");
     mailSender.setPassword("163邮箱密码");

MimeMessage mailMessage = mailSender.createMimeMessage();
     MimeMessageHelper helper = new MimeMessageHelper(mailMessage,true,"GBK");
     helper.setFrom(mailSender.getUsername());
     helper.setTo(email);
     helper.setSubject("title");
     helper.setText("邮件发送成功");
     String emailToken = getEmailToken(user);
     String url = "<a href='http://localhost:8088/activateMail?emailToken="+emailToken+"'>激活"+"</a></br><h1>如果以上超连接无法访问,请将以下网址复制到浏览器地址栏中</h1><h2>http://localhost:8088/activateMail?emailToken="+emailToken+"</h2>";
     helper.setText(url,true);
     mailSender.send(mailMessage);
     return true;
   }catch (Exception e){
     e.printStackTrace();
     return false;
   }
 }

 

此方法解释:

1.如果你的服务端邮箱是qq邮箱,则修改为:mailSender.setHost("smtp.qq.com");

2.MimeMessageHelper是javax下mail的拓展类,如果你使用spring封装的mail则不需要。如果使用spring的mail,set方法都会不同

3.helper.setText(url,true);的第二个参数true表示当前String是html格式,所以标签都会起作用

4.getEmailToken(user);方法会在下面讲到

到这里为止,邮件已经可以正常发送,为了方便我给出html页面代码:


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
<form method="get" action="/myajaxRegister">
 email<input type="text" name="email"></br>
 <input type="submit" value="register">
</form>
</body>
</html>

问题二

如何使用get请求的API来激活邮件?

问题一中senEmail()下的getEmailToken(user)正是用来激活的

可以看出senEmail()发送的邮件内容是一个超链接,它就是用来启动我们的激活接口

但是这和getEmailToken(user)又有什么关系呢

从字面意思可以看出,我们这里将会使用一个token

先看激活controller


@RequestMapping(value = "activateMail")
 public String activateMail(@RequestParam String emailToken){
   if (emailService.balanceToken(emailToken)){
     return "success";
   }
   return "error1";
 }

 

通过超链接,我们发送一个emailToken参数给服务器

服务器拿到这个token之后,便会和本地的token进行比对,如果相同,则通过验证

这里我使用redis来做缓存,并且以token为key,用户信息(User)为value

来看两个方法:


@Override
 public String getEmailToken(User user){
   String token = UUID.randomUUID().toString();
   String value = user.toString();
   redisTemplate.opsForValue().set(token,value);
   return token;
 }

@Override
 public boolean balanceToken(String emailToken) {
   if(redisTemplate.opsForValue().get(emailToken)!=null){
     return true;
   }
   return false;
 }

 

第一个方法使用redis将User信息转换成String并存入内存

第二个方法便是激活验证,通过key(Token)来检查redis中是否有值,成功返回true

问题三

那么如果设置邮箱验证的有效期呢?

讲到这里,经常使用redis的同学估计已经猜到了

只需要在getEmailToken()中加入一行代码即可:


@Override
 public String getEmailToken(User user){
   String token = UUID.randomUUID().toString();
   String value = user.toString();
   redisTemplate.opsForValue().set(token,value);
   redisTemplate.expire(token,60, TimeUnit.SECONDS);
   return token;
 }

没错,使用redisTemplate.expire()设置当前键值对的过期时间

最后,来看下激活邮件吧:

JavaMailSender实现邮箱验证功能

来源:https://segmentfault.com/a/1190000012433867

标签:JavaMailSender,邮箱验证
0
投稿

猜你喜欢

  • springboot拦截器过滤token,并返回结果及异常处理操作

    2023-02-19 11:45:50
  • 可视化Swing中JTable控件绑定SQL数据源的两种方法深入解析

    2023-11-28 19:13:58
  • Java PreparedStatement用法详解

    2023-08-08 20:20:51
  • java map转Multipart/form-data类型body实例

    2023-04-19 13:16:18
  • Android 沉浸式状态栏及悬浮效果

    2023-07-29 23:03:15
  • Java删除二叉搜索树的任意元素的方法详解

    2021-10-04 12:27:26
  • 面试官:详细谈谈Java对象的4种引用方式

    2022-09-19 04:52:20
  • 使用java springboot设计实现的图书管理系统(建议收藏)

    2023-11-25 00:54:49
  • Java实现SSL双向认证的方法

    2023-09-22 10:34:35
  • 两种JAVA实现短网址服务算法

    2023-05-08 12:17:30
  • Java中包装类和Arrays类的详细介绍

    2023-12-03 22:04:13
  • java判断http地址是否连通(示例代码)

    2023-08-05 03:24:05
  • Java 数据结构与算法系列精讲之排序算法

    2023-11-01 13:25:40
  • 解决Spring Cloud feign GET请求无法用实体传参的问题

    2023-11-17 14:14:05
  • mybatis水平分表实现动态表名的项目实例

    2023-04-02 22:11:42
  • Java监听器的作用及用法代码示例

    2023-06-24 06:59:07
  • JavaWeb搭建网上图书商城毕业设计

    2023-08-29 00:08:32
  • eclipse如何搭建Springboot项目详解

    2023-11-29 04:52:36
  • Java画笔的简单实用方法

    2021-11-01 05:38:10
  • java进阶解析Springboot上传excel存入数据库步骤

    2022-01-07 15:18:51
  • asp之家 软件编程 m.aspxhome.com