
org.springframework.boot
spring-boot-starter-mail
二、在配置文件中设置邮箱信息
设置邮箱
spring.mail.host=smtp.qq.com spring.mail.port=465 spring.mail.protocol=smtp # 发送邮箱的账号 spring.mail.username=XXXXX@qq.com # 此为开通qq邮箱POP3/SMTP服务之后的激活码 spring.mail.password=******** spring.mail.default-encoding=UTF-8 spring.mail.test-connection=true # 可以不用设置 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory spring.mail.properties.mail.smtp.debug=true三、设置邮件内容等
@Component
public class RegisterEmailService {
@Value("${spring.mail.username}")
private String fromEmail;
@Autowired
private JavaMailSender javaMailSender;
@Async
public void sendEmail(String toEmail){
// 验证真的使用我们自己线程
System.out.println(Thread.currentThread().getName());
SimpleMailMessage message = new SimpleMailMessage();
// 设置发件人账号
message.setFrom(fromEmail);
// 设置收件人账号
message.setTo(toEmail);
// 设置邮件标题
message.setSubject("【Lyman】注册激活邮件");
// 设置邮件内容
String content = "您的注册已成功,请点击链接去激活";
message.setText(content);
javaMailSender.send(message);
}
}
@Async:开启异步,为springboot提供的注解,我们可以重写它的线程池
四、设置发送邮箱为单独的线程操作@EnableAsync
@Configuration(proxyBeanMethods = false)
public class EmailThreadPool implements AsyncConfigurer {
//处理线程执行过程中异常(记录日志:保存现场)
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return AsyncConfigurer.super.getAsyncUncaughtExceptionHandler();
}
private static final int CORE_POOL_SIZE = 2;
private static final int MAX_POOL_SIZE = 5;
private static final int KEEP_ALIVE_SECONDS = 10;
private static final String THREAD_NAME_PREFIX = "email-thread-";
private static final int QUEUE_CAPACITY = 1000;
@Override
public Executor getAsyncExecutor() {
// 使用 spring 提供的线程池 定制操作
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 1.设置核心线程数
executor.setCorePoolSize(CORE_POOL_SIZE);
// 2.设置最大线程数
executor.setMaxPoolSize(MAX_POOL_SIZE);
// 3.设置空闲线程存活时间
executor.setKeepAliveSeconds(KEEP_ALIVE_SECONDS);
// 5. 设置线程工厂 (使用是JUC 线程工具类Executors 提供线程工厂 )
executor.setThreadFactory(new CustomizableThreadFactory(THREAD_NAME_PREFIX));
// 6. 线程任务队列要使用有界(有限的)队列
executor.setQueueCapacity(QUEUE_CAPACITY);
// 7. 等待当前线程池中线程任务完成才去关闭(必须设置)
executor.setWaitForTasksToCompleteOnShutdown(true);
// 8. 采用juc中 ThreadPoolExecutor 直接丢弃
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.initialize();
return executor;
}
}
@EnableAsync:开启异步