添加依赖

1
2
3
4
5
<!-- 邮件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

添加配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
spring:
# 邮件配置
mail:
username: Reisen7@163.com
password: TJqip9ditF9zHx8Q
host: smtp.163.com
port: 465
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
socketFactory:
port: 465
class: javax.net.ssl.SSLSocketFactory
fallback: false
valid: 5
title: "老年人健康科普信息系统 - 用户认证"
template: "您的动态验证码为:<strong style='color: red'>%s</strong>,%d分钟内有效,若非本人操作,请勿泄露。"

后端发验证码

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.shanzhu.purchase.util;

import cn.hutool.core.util.RandomUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
* Author Reisen7
* Date 2025/3/16 17:29
* description
*/

@Component
public class EmailClient {

@Autowired
private JavaMailSenderImpl mailSender;

/**
* 发送方邮箱
*/
@Value("${spring.mail.username}")
private String email;

/**
* 有效时长
*/
@Value("${spring.mail.valid}")
private Integer valid;

/**
* 内容模版
*/
@Value("${spring.mail.template}")
private String template;

/**
* 标题
*/
@Value("${spring.mail.title}")
private String title;

/**
* 发送邮件验证码
*
* @param targetEmail 目标邮箱
* @return 验证码
*/
public String sendEmailCode(String targetEmail) {
// 生成随机验证码
String verifyCode = RandomUtil.randomNumbers(6);
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
try {
helper.setSubject(title);
helper.setText(String.format(template, verifyCode, valid), true);
helper.setFrom(email);
helper.setTo(targetEmail);
} catch (MessagingException e) {
e.printStackTrace();
}
mailSender.send(mimeMessage);
return verifyCode;
}

/**
* 发送邮箱
*
* @param targetEmail 目标邮箱
* @param content 发送内容
*/
public void sendEmail(String targetEmail, String title, String content) {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
try {
helper.setSubject(title);
helper.setText(content, true);
helper.setFrom(email);
helper.setTo(targetEmail);
} catch (MessagingException e) {
e.printStackTrace();
}
mailSender.send(mimeMessage);
}
}

redis存验证码

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
package com.shanzhu.purchase.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

/**
* Author Reisen7
* Date 2025/3/16 18:31
* description
*/


@Service
public class RedisCodeService {

@Autowired
private StringRedisTemplate redisTemplate;

/**
* 存储验证码到 Redis 并设置过期时间
* @param key 存储的键,通常为与验证码关联的标识,如手机号、邮箱等
*如手机号、邮箱等
* @param code 验证码
*/
public void saveCodeToRedis(String key, String code) {
// 将验证码存储到 Redis 中,并设置 60 秒的过期时间
redisTemplate.opsForValue().set(key, code, 60, TimeUnit.SECONDS);
}

/**
* 从 Redis 中获取验证码并验证
* @param key 存储的键
* @param inputCode 用户输入的验证码
* @return 是否验证成功
*/
public boolean verifyCodeFromRedis(String key, String inputCode) {
// 从 Redis 中获取存储的验证码
String storedCode = redisTemplate.opsForValue().get(key);
System.out.println("=============================");
System.out.println(storedCode);
// 判断存储的验证码是否存在且与用户输入的验证码一致
return storedCode != null && storedCode.equals(inputCode);
}
}