一、引入邮件发送依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
二、配置文件
#QQ邮箱服务器
spring.mail.host=smtp.qq.com
#端口号
spring.mail.port=587
#你的QQ邮箱账户
spring.mail.username=你的QQ号@qq.com
#你的QQ邮箱第三方授权码
spring.mail.password=你的QQ邮箱第三方授权码
#编码类型
spring.mail.default-encoding=UTF-8
三、自定义@Async线程池
package com.trade.market.Thread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.lang.reflect.Method;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync//开启异步功能
public class BaseAsyncConfigurer implements AsyncConfigurer {
private static final Logger LOG = LoggerFactory.getLogger(BaseAsyncConfigurer.class);
/**
* 核心线程数10:线程池创建时候初始化的线程数
* 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
* 缓冲队列200:用来缓冲执行任务的队列
* 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
* 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
* 线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
* @return
*/
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(200);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("taskExecutor-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();//初始化
return executor;
}
/*异步任务中异常处理*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (Throwable ex, Method method, Object... params)->{
//todo 异步方法异常处理
LOG.error("class#method: {}" ,method.getDeclaringClass().getName() ,"#{}" ,method.getName());
LOG.error("type : {}" , ex.getClass().getName());
LOG.error("exception : {}" , ex.getMessage());
};
}
}
四、定义邮件发送工具类
package com.trade.market.Thread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class SendEmail{
@Resource
private JavaMailSenderImpl mailSenderl;
@Value("${spring.mail.username}")
private String from;
private static final Logger LOG = LoggerFactory.getLogger(SendEmail.class);
@Async
public void sendSimpleEmail(String to,String subject,String text){
SimpleMailMessage message=new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(text);
// 发送邮件
mailSenderl.send(message);
LOG.info("邮件发送结果:发送成功!");
}
}
五、使用方法