欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaMailSender实现邮箱验证功能

程序员文章站 2024-02-18 21:05:22
本文通过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实现邮箱验证功能

以上就是本次介绍的javamailsender实现邮箱注册验证的全部内容,如果大家还有不明白的地方,可以在下方的留言区讨论。