JavaMailSender实现邮箱验证功能

 更新时间:2017年12月18日 11:26:26   投稿:laozhang  
本篇文章主要给大家介绍了JavaMailSender实现邮箱注册验证的功能实现原理以及其中遇到的问题,一起跟着学习探讨下吧。

本文通过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实现邮箱注册验证的全部内容,如果大家还有不明白的地方,可以在下方的留言区讨论。

相关文章

  • 一文搞懂设计模式中的单例模式

    一文搞懂设计模式中的单例模式

    这篇文章主要介绍了一文搞懂设计模式中的单例模式,单例模式是最简单的设计模式之一,属于创建型模式,它提供了一种创建对象的方式,确保只有单个对象被创建,需要的朋友可以参考下
    2023-08-08
  • IDEA创建Maven项目后报错不出现src文件夹的情况解决

    IDEA创建Maven项目后报错不出现src文件夹的情况解决

    最近刚开始学习maven,正准备使用idea创建一个maven项目练手,却发现自己创建的maven项目始终没有src目录,下面这篇文章主要给大家介绍了关于IDEA创建Maven项目后报错不出现src文件夹的情况解决,需要的朋友可以参考下
    2023-05-05
  • java 微信随机红包算法代码实例

    java 微信随机红包算法代码实例

    这篇文章主要介绍了java 微信随机红包算法的相关资料,并附实例代码,需要的朋友可以参考下
    2016-10-10
  • java实现简易聊天功能

    java实现简易聊天功能

    这篇文章主要为大家详细介绍了java实现简易聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java实现按权重随机数

    Java实现按权重随机数

    这篇文章主要介绍了Java实现按权重随机数,本文给出了提出问题、分析问题、解决问题三个步骤,需要的朋友可以参考下
    2015-04-04
  • java实现监听u盘示例分享

    java实现监听u盘示例分享

    这篇文章主要介绍了java实现监听u盘示例,需要的朋友可以参考下
    2014-03-03
  • SpringCloud灰度发布的设计与实现详解

    SpringCloud灰度发布的设计与实现详解

    这篇文章主要介绍了SpringCloud灰度发布的设计与实现详解,灰度从字面意思理解就是存在于黑与白之间的一个平滑过渡的区域,所以说对于互联网产品来说,上线和未上线就是黑与白之分,而实现未上线功能平稳过渡的一种方式就叫做灰度发布,需要的朋友可以参考下
    2023-09-09
  • Java类的加载连接和初始化实例分析

    Java类的加载连接和初始化实例分析

    这篇文章主要介绍了Java类的加载连接和初始化,结合具体实例形式分析了java类的加载、连接、初始化相关原理与实现技巧,需要的朋友可以参考下
    2019-07-07
  • 基于java中集合的概念(详解)

    基于java中集合的概念(详解)

    下面小编就为大家带来一篇基于java中集合的概念(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 基于SpringBoot实现上传2种方法工程代码实例

    基于SpringBoot实现上传2种方法工程代码实例

    这篇文章主要介绍了基于SpringBoot实现上传工程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论