❝
最近开发了一个社区网站,网站地址:
https://developer.ppdxzz.org.cn
, 其中在注册账号的时候用到了邮箱验证,特此记录一下,记录知识,同时方便大家查阅参考。❞
首先分析一下大体做法,用户使用邮箱注册时,需要向用户邮箱发送一个验证链接,用户点击链接对邮箱进行激活的这样一个操作,由此来完成邮箱的激活。
这里后台向用户发送的链接需要携带一个唯一值用来对用户进行标识,我这里选择用UUID,因为生成唯一也比较好管理,一般的话激活链接是有时效性的,就是说不是一直有效,比如设置24小时激活有效,超过24小时就得重新注册激活。这个可以使用redis来控制,通过UUID键是否存在于redis中来判断是否在有效期,存在即可激活,激活成功后删除这个UUID键,激活失败则是链接时效期可能过了24小时或者其他原因。
1.导入依赖
//发送邮箱依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
//redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
//thymeleaf模板引擎依赖,注册邮箱发送以及激活模板
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
//hutool工具包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.1.2</version>
</dependency>
2.邮件信息配置application.properties
#这里我使用163邮箱主机,其他同理
spring.mail.host=smtp.163.com
spring.mail.default-encoding=UTF-8
# 发送账号,用户名,也就是使用哪个邮箱发送
spring.mail.username=xxx@163.com
# 密码,这里密码一般指的是授权密码,开启POP3/SMTP服务
spring.mail.password=xxxxxx
# 邮箱验证链接前缀,到时候拼接uuid
my-config-mail.ip=http://127.0.0.1:8088/verifyMail/
3.发送邮件逻辑
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private TemplateEngine templateEngine;
@Value("${spring.mail.username}")
private String from;
@Value("${my-config-mail.ip}")
private String prefixIp;
//生成用户唯一标识uuid,redis设置过期时间24小时
String uuid = IdUtil.simpleUUID();
redisTemplate.opsForValue().set(uuid,request.getEmail(),24,TimeUnit.HOURS);
try {
//获取邮箱接受者,根据你自己逻辑获取
String email = request.getEmail();
Context context = new Context();
context.setVariable("email",email);
context.setVariable("activeUrl",prefixIp+uuid);
//调用邮件发送模板页面,渲染email接收者、activeUrl激活链接
String emailTemplate = templateEngine.process("emailTemplate", context);
//创建可以HTML发送的邮件
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("Cloud云社区 <"&