当前位置: 移动技术网 > IT编程>开发语言>Java > JavaMailSender实现邮箱验证功能

JavaMailSender实现邮箱验证功能

2019年07月19日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网