SpringBoot 邮件发送与异步优化
422 字
2 分钟
SpringBoot 邮件发送与异步优化
SpringBoot 邮件发送与异步优化
基础配置
1. 引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId></dependency>2. 配置邮箱参数
spring: mail: password: your-auth-code host: smtp.163.com密码处填写的是邮箱的 授权码,不是邮箱登录密码。以 163 邮箱为例,需要在设置 → POP3/SMTP/IMAP 中开启服务并获取授权码。
3. 发送简单邮件
@RestController@RequiredArgsConstructorpublic class EmailController {
private final JavaMailSender javaMailSender;
@GetMapping("/send-email") public String sendEmail(String email) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(email); message.setSubject("验证码"); message.setText("您的验证码是:123456"); javaMailSender.send(message); return "ok"; }}使用 @Async 实现异步发送
同步发送邮件会阻塞请求线程,高并发场景下推荐异步化。
1. 开启异步支持
@SpringBootApplication@EnableAsyncpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}2. 异步发送服务
@Component@Slf4jpublic class EmailService {
@Autowired private JavaMailSender javaMailSender;
@Autowired private StringRedisTemplate stringRedisTemplate;
@Async public void sendVerificationCode(String email) { String code = UUID.randomUUID().toString().substring(0, 6); SimpleMailMessage message = new SimpleMailMessage(); message.setTo(email); message.setSubject("验证码"); message.setText(code);
stringRedisTemplate.boundValueOps("code:" + email) .set(code, 5, TimeUnit.MINUTES); javaMailSender.send(message); log.info("Verification code sent to: {}", email); }}3. 自定义线程池
默认的异步线程池核心线程数为 8,可根据业务调整:
spring: task: execution: pool: core-size: 50或通过 Java 配置:
@Beanpublic ThreadPoolTaskExecutor threadPoolExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(20); executor.setMaxPoolSize(50); executor.setQueueCapacity(200); executor.setThreadNamePrefix("mail-executor-"); executor.initialize(); return executor;}@Async 失效的常见原因
使用 @Async 时,以下情况会导致注解失效:
- 方法不是
public的 - 返回值不是
void或Future - 方法使用
static修饰 - Spring 扫描不到类(缺少
@Component/@Service等注解) - 调用方与被调用方在同一个类中(Spring AOP 代理无法拦截内部调用)
- 通过
new手动创建对象,而非依赖注入 - 在
@Async方法上直接加@Transactional无效——应在被调用的方法上加
参考:https://blog.csdn.net/u011413452/article/details/124844941
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
SpringBoot 邮件发送与异步优化
https://blog.zinzin.cc/posts/springboot-email/相关文章智能推荐
1
SpringBoot 调用腾讯云 API 发送短信
Java从原始 API 调试到封装为 Spring Boot 工具类的渐进式实践,包含配置属性绑定和静态工具类设计。
2
服务器日常初始化指南
Linux运维与部署新服务器到手后的安全加固与常用软件安装清单,包含 SSH 安全配置、Docker、NPM 等。
3
Docker 镜像与容器导入导出命令详解
Linux运维与部署梳理 docker commit/export/import/save/load 的区别与适用场景,帮你选对正确的命令。
4
2025 年终总结
年度总结2025 年的回顾与思考,涵盖工作、学习、身体、书评、游戏、番剧与旅行。
5
使用 acme.sh 申请泛域名 SSL 证书
Linux运维与部署通过 acme.sh + Cloudflare DNS API 免费申请 Let's Encrypt 泛域名证书,并自动续期。
随机文章随机推荐













