SpringBoot邮箱注册验证

注册功能是一个网站的基本功能
刚刚实现了用邮箱来注册并验证的程序
这里记录下
html

有了上篇SpringBoot发送邮件的基础,咱们就能够完成一个简单的邮箱注册功能了java

首先咱们要在SpringBoot里配置pom.xml文件

 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
    
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

这个比起以前的邮件服务还多了两个配置
分别是
mysql

  • mysql驱动
  • jpa

在application.properties中添加邮件和mysql配置

 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
    
spring.mail.host=smtp.mxhichina.com
spring.mail.username=邮箱帐号
spring.mail.password=密码
spring.mail.default-encoding=UTF-8
mail.fromMail.addr=你想要用来发送的邮箱
server.port=8899
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

数据库的用户字段

用户字段至少要有这几个方面组成git

  • 用户邮箱
  • 用户密码
  • 用户激活状态
  • 用户激活码

激活状态用来显示用户是否已经经过邮箱完成激活,未完成为 0 完成为 1github

激活码是一串随机字符串,用来在邮件中添加用户标识spring

邮箱验证的流程

用户填写完帐号密码点击注册后
后台获取用户信息
验证是否合法
若是合法就将用户激活状态置0
开启邮件发送服务
用户收到邮件,邮件里有一个链接,由用户id 和 激活码组成
用户点击激活连接
帐号完成激活,用户激活状态置1
sql

至此,一个简单的注册流程就完成了数据库

一些相关代码

发送验证邮件服务
api

 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
    
if(!user.getUserEmail().matches("^\\w+@(\\w+\\.)+\\w+$")) {
return ResultUtil.error(10, "邮箱不合法");
}
if(userRepository.findByUserEmail(user.getUserEmail()) != null) {
return ResultUtil.error(2, "邮箱已被注册");
}
//加盐
String code = CodeUtil.generateCode(user.getUserEmail());
String codepw = CodeUtil.generateCode(user.getPassword());
user.setPassword(codepw);
user.setUserState(0);
user.setUserCode(code);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
user.setRegisterTime(df.format(new Date()));
if(mailUtil.sendRegisterMail(user.getUserEmail(), code)) {
return ResultUtil.success(userRepository.save(user));
}
return ResultUtil.error(4, "邮件发送失败");

发送html邮件
app

 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
    
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
/**
* Created by cw on 2017/7/19.
*/
@Component
public class MailUtil {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender mailSender;
@Autowired
private TemplateEngine templateEngine;
@Value("${mail.fromMail.addr}")
private String from;
public boolean sendRegisterMail(String email, String code) {
MimeMessage message = mailSender.createMimeMessage();
String register_link = "http://localhost:8899/api/email=" + email + "/code=" +code;
//建立邮件正文
Context context = new Context();
context.setVariable("register_link", register_link);
String emailContent = templateEngine.process("UserRegisterTemplate", context);
try {
//true表示须要建立一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(email);
helper.setSubject("低电查询验证邮件");
helper.setText(emailContent, true);
mailSender.send(message);
logger.info("html邮件发送成功");
return true;
} catch (MessagingException e) {
logger.error("发送html邮件时发生异常!", e);
return false;
}
}
}

邮箱验证

 
    
1
2
3
4
5
6
7
8
9
10
 
    
@Override
public Result userCheckMail(String email, String code) {
User user = userRepository.findByUserCode(code);
if(user.getUserEmail() != null && user.getUserEmail().equals(email)) {
user.setUserState(1);
userRepository.save(user);
return ResultUtil.success();
}
return ResultUtil.error(6, "邮件验证失败");
}