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