本文通过JavaMailSender实现邮箱注册验证中遇到的问题开始着手,给大家详细分析了其原理以及问题的解决办法。
使用邮箱注册验证,我们需要理清设计思路:
问题一:注册信息提交后需要对填写的邮箱号发送邮件
问题二:邮件到达时用户如何进行激活,是通过get请求还是获取验证码(本篇使用get接口激活)
问题三:邮件激活如何设置有效时间
通过以上三个问题,博主来帮助大家掌握JavaMailSender邮箱验证
问题一
我首先需要解决如何向指定邮箱号发送邮件
在pom中加入如下依赖:
1
2
3
4
5
6
|
<!--email-->
< dependency >
< groupId >javax.mail</ groupId >
< artifactId >mail</ artifactId >
< version >1.4.7</ version >
</ dependency >
|
没错,我们使用javax拓展包下的mail依赖,所以代码中import别选错了
本篇代码一切从简,方便大家读懂
从上到下,我们先看接口:
1
2
3
4
5
6
7
8
9
10
11
12
|
@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才是关键
新建线程来执行邮件发送方法是为了提高用户的体验
试想下如果不为异步,用户需要等待邮件发送完才能跳转页面
来看邮件发送的业务层方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@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页面代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!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
1
2
3
4
5
6
7
|
@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
来看两个方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@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()
中加入一行代码即可:
1
2
3
4
5
6
7
8
|
@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