JavaMailSender实现邮箱验证功能

2025-05-29 0 74

本文通过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实现邮箱验证功能

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

原文链接:https://segmentfault.com/a/1190000012433867

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 JavaMailSender实现邮箱验证功能 https://www.kuaiidc.com/113420.html

相关文章

发表评论
暂无评论