首先我们在controller写一个接口
/**
* @author 作者: 青衫烟雨客
* @version 版本: 1.0
* @description 描述: 邮箱验证码发送接口类,实现简单文本验证码的发送功能
* <p>
* 此接口接收一个包含邮箱信息的请求实体(EmailRequest),并负责处理邮件发送逻辑,
* 发送完成后返回一个封装了响应状态和数据的对象(R)。
* <p>
* 注意:该接口方法在执行过程中可能会抛出jakarta.mail.MessagingException和UnsupportedEncodingException异常,
* 分别对应邮件发送过程中的通信错误以及编码格式不支持的情况。
* @param: emailRequest 请求参数对象,包含待发送验证码的邮箱地址等信息
* @return 返回值类型为R,通常包含操作结果状态、消息及可能的数据内容
* @throws jakarta.mail.MessagingException 在邮件发送过程中出现的通信异常
* @throws UnsupportedEncodingException 编码格式不被支持时抛出的异常
* @date 创建日期: 2024/2/26 下午 10:55
*/
public interface MailboxCollection {
R putCode(EmailRequest emailRequest) throws MessagingException, UnsupportedEncodingException;
}
实现controller接口
@RestController
@Slf4j
@RequestMapping("/sendCode")
public class mailboxController implements MailboxCollection {
@Autowired
private mailBoxServiceImp serviceImp;
@PostMapping()
@Log
public R putCode(@RequestBody EmailRequest emailRequest) {
try {
String s = serviceImp.sendEmail(emailRequest);
log.info("邮箱验证码发送");
return R.success(s);
} catch (Exception e) {
// 如果未使用@ControllerAdvice处理全局异常,则在此处捕获并处理
log.error("发送邮件时发生异常", e);
return R.success(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("发送HTML邮件时发生错误: " + e.getMessage()));
}
}
}
将逻辑放到server层处理
Server接口
public interface MailBoxService {
String sendEmail(EmailRequest emailRequest) throws MessagingException, UnsupportedEncodingException;
}
实现Server接口
package com.chao.service.imp;
import com.chao.pojo.EmailRequest;
import com.chao.service.MailBoxService;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
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.Service;
import java.io.UnsupportedEncodingException;
import static com.chao.utils.VerificationCodeGenerator.generateRandomCode;
/**
* 邮箱服务实现类,实现了 {@link MailBoxService} 接口,
* 提供了发送带有随机验证码的电子邮件的功能。
*
* @author 青衫烟雨客
* @since 1.0
*/
@Service
@Slf4j
public class mailBoxServiceImp implements MailBoxService {
/**
* Spring Boot 自动注入的 JavaMailSender 对象,用于发送邮件。
*/
@Autowired
private JavaMailSender javaMailSender;
/**
* 配置文件中读取的邮件发送者用户名,默认发件人地址。
*/
@Value("${spring.mail.username}")
private String userName;
/**
* 配置文件中读取的邮件发送者显示名,默认发件人名称。
*/
@Value("${spring.mail.addressName}")
private String addressName;
@Value("${spring.mail.TextHeader}")
private String TextHeader;
@Value("${spring.mail.TextEnd}")
private String TextEnd;
/**
* 发送包含验证码的电子邮件方法。
* 根据传入的 {@link EmailRequest} 对象配置邮件的基本信息(收件人、主题),
* 并生成一个随机验证码作为邮件正文发送出去。
* 发送成功后返回生成的验证码以便后续验证使用。
*
* @param emailRequest 邮件请求对象,包含收件人地址和邮件主题等信息
* @return 发送的验证码字符串
* @throws MessagingException 发生邮件发送相关错误时抛出异常
* @throws UnsupportedEncodingException 编码格式不支持时抛出异常
*/
@Override
public String sendEmail(@NotNull EmailRequest emailRequest) throws MessagingException, UnsupportedEncodingException {
// 获取收件人地址
String to = emailRequest.getTo();
// 获取邮件主题
String subject = emailRequest.getSubject();
// 创建MIME邮件消息对象
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// 创建MIME邮件帮助器对象,用于设置邮件内容
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
// 检查收件人地址有效性
if (to == null || to.isEmpty()) {
throw new IllegalArgumentException("收件人地址不能为空或空");
}
// 设置发件人信息(用户名和显示名)
message.setFrom(userName, addressName);
// 设置收件人地址
message.setTo(to);
// 设置邮件主题
message.setSubject(subject);
// 生成并设置邮件正文(验证码)
String verificationCode = generateRandomCode(5);
message.setText(TextHeader + ":" + verificationCode + ","+TextEnd);
// 发送邮件
javaMailSender.send(mimeMessage);
// 返回生成并发送的验证码
return verificationCode;
}
}
在配置文件增加以下内容:
mail:
# 邮件服务器地址,这里以smtp.example.com为例,实际应替换为你的SMTP邮件服务器地址
host: smtp.qq.com
# SMTP服务器端口,常见的有25、465(SSL)和587(STARTTLS),此处配置为587
port: 465
addressName: 邮箱主题
# 发送邮件的用户名,通常是你的真实邮箱地址
username: 邮箱地址
password: 邮箱秘钥
TextHeader: 您的验证码是
TextEnd :邮件验证码的后半段
# 发送邮件的密码,如果是使用应用专用密码或授权码,请填入对应的值
# 注意:对于某些邮件服务提供商,如Gmail,可能需要创建一个应用特定密码或启用“少安全应用”设置
properties:
mail:
smtp:
# 是否启用SMTP身份验证,大多数情况下应设为true
auth: true
starttls:
enable: true
R 的后端响应模板
@Data
@NoArgsConstructor
@AllArgsConstructor
public class R {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应信息 描述字符串
private Object data; //返回的数据
//增删改 成功响应
public static @NotNull R success() {
return new R(1, "success" , null);
}
//查询 成功响应
public static @NotNull R success(Object data) {
return new R(1, "success" , data);
}
//失败响应
public static @NotNull R error(String msg) {
return new R(0, msg, null);
}
}