目录
一、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
二、application.yml配置
spring:
mail:
host: smtp.qq.com
port: 465
username: 你的qq邮箱
password: 你的qq邮箱授权码
protocol: smtps
default-encoding: UTF-8 #默认编码格式
properties:
mail:
debug: true #启动debug调试
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory #SSL连接配置
Spring Mail的配置信息,用于设置邮件发送相关参数。
host
: SMTP服务器的地址,这里使用QQ邮箱的SMTP服务器地址。port
: SMTP服务器监听的端口,默认为25,但QQ邮箱SMTP服务器采用SSL加密传输需要使用465端口。username
: 发送邮件的邮箱账号,这里填写QQ邮箱的账号。password
: 发送邮件的邮箱账号的授权码,用于验证邮箱身份,这里也填写QQ邮箱的账号的授权码。protocol
: 使用协议类型,这里选择smtps,即SMTP-over-SSL。default-encoding
: 默认编码格式,这里设置为UTF-8。debug
: 是否启动调试模式,当设置为true
时会打印出更多调试信息。properties
: 设定额外的属性,这里设置了mail
和smtp
两个属性,socketFactory
则对应SSL连接所需的类。
三、EmailService代码解读
@Service
public class EmailService {
创建一个名为EmailService
的服务类。
@Autowired
private JavaMailSender mailSender;
使用Spring的自动装配(Autowired)特性注入一个JavaMailSender实例作为依赖项。JavaMailSender是用于发送邮件的Spring框架中的接口。
@Value("${spring.mail.username}")
private String from;
使用注释值(Value)来从配置文件中读取属性值,这里指的是spring.mail.username
的值并将其变量化成from
。
public void sendMail(String to, String subject, String content) throws MessagingException {
在服务类中定义名为sendMail
的方法,该方法接收三个参数(to
、 subject
和content
)并且可以抛出MessagingException
异常。
MimeMessage message = mailSender.createMimeMessage();
创建邮件消息对象message
,使用注入的mailSender
的实例方法createMimeMessage()
来创建相应的MIME消息。
MimeMessageHelper helper = new MimeMessageHelper(message, true);
创建一个帮助程序对象helper并将上述邮件消息message
与之关联。true
表示需要支持附件,否则设为false。
helper.setFrom(from);
设置发件人信息,在此处由变量from
表示。
helper.setTo(to);
设置收件人信息,该信息由传入的参数to
表示。
helper.setSubject(subject);
设置邮件主题,该主题由传入的参数subject
表示。
helper.setText(content, true);
设置邮件正文,并指示内容是否为HTML格式。内容是由传入的参数 content
表示的。
mailSender.send(message);
发送邮件,使用注入的mailSender
实例的方法send()
来将构造好的message
对象发送。
四、VerificationCodeUtils随机验证码代码解读
public class VerificationCodeUtils {
这一行声明一个公共类(public class)VerificationCodeUtils。
public static String generateCode(int length) {
这一行是声明一个公共的静态方法(public static method),名称为generateCode,返回类型为字符串(String),其中有一个参数,名称为length,表示生成的验证码的长度。
StringBuilder s = new StringBuilder();
这一行是声明一个空白的字符串构建器(StringBuilder),用于存储生成的验证码。
Random random = new Random();
这一行是声明一个随机数生成器(Random),用来产生随机数字。
for (int i = 0; i < length; i++) {
int n = random.nextInt(10);
s.append(n);
}
这一段是循环生成随机数字,并将其添加到指定长度的字符串构建器中。
return s.toString();
}
}
五、controller层代码解读
@Autowired
private EmailService emailService;
这行代码使用Spring的依赖注入自动将EmailService类的实例注入到emailService变量中。
private final Map<String, String> emailCodeMap = new ConcurrentHashMap<>(16);
这行代码声明一个并发哈希映射对象,用于存储邮箱验证码的键值对信息。
@PostMapping("/register")
public ApiResponse<String> register(@RequestBody Mail mail) throws MessagingException {
这行代码通过PostMapping注解配置了一个基于HTTP POST方法的请求处理,当收到路径为“/register”的请求时,它会将请求体反序列化成Mail类型的mail参数。ApiResponse是响应结果的数据类型,其中ResponseCode.SUCCESS表示成功状态码,"验证码已发送"是结果消息的内容。
String code = VerificationCodeUtils.generateCode(6);
这行代码调用VerificationCodeUtils工具类的generateCode方法生成一个6位数字的随机验证码,并将其保存在code变量中。
String subject = "注册验证码";
String content = "尊敬的用户,您的验证码为:" + code;
emailService.sendMail(mail.email, subject, content);
这三行代码设置邮件主题和内容,然后使用调用EmailService的sendMail方法将邮件发送给指定的邮箱(mail.email),以及验证码的message。
emailCodeMap.put(mail.email, code);
这行代码将(邮箱,验证码)键值对信息放入emailCodeMap哈希映射中。
return new ApiResponse<>(ResponseCode.SUCCESS,"验证码已发送");
最后,这行代码返回ApiResponse对象,该对象包含了响应结果的状态码和消息内容。
六、整体代码
@Autowired
private EmailService emailService;
// 存储已发送的验证码
private final Map<String, String> emailCodeMap = new ConcurrentHashMap<>(16);
@PostMapping("/register")
public ApiResponse<String> register(@RequestBody Mail mail) throws MessagingException {
// 检查邮箱是否已被注册
// ...
// 生成验证码
String code = VerificationCodeUtils.generateCode(6);
// 发送邮件
String subject = "注册验证码";
String content = "尊敬的用户,您的验证码为:" + code;
emailService.sendMail(mail.email, subject, content);
// 保存验证码
emailCodeMap.put(mail.email, code);
return new ApiResponse<>(ResponseCode.SUCCESS,"验证码已发送");
}
@Data
public class Mail {
public String email;
public String username;
public String password;
}
@Service
public class EmailService {
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
/**
* 发送邮件
*
* @param to 收件人邮箱
* @param subject 邮件主题
* @param content 邮件内容
*/
public void sendMail(String to, String subject, String content) throws MessagingException {
// 创建邮件消息
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
// 发送邮件
mailSender.send(message);
}
}
public class VerificationCodeUtils {
/**
* 生成随机验证码
*
* @param length 验证码长度
* @return 验证码
*/
public static String generateCode(int length) {
StringBuilder s = new StringBuilder();
Random random = new Random();
for (int i = 0; i < length; i++) {
int n = random.nextInt(10);
s.append(n);
}
return s.toString();
}
}