引用依赖包到 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置文件
163邮箱配置
spring.mail.host=smtp.163.com #邮箱服务器地址
spring.mail.username=xxx.163.com #用户名
spring.mail.password=ooo #开启POP3之后设置的客户端授权码
spring.mail.default-encoding=UTF-8 #编码
##超时可选
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000
注意
1、这里的password不是登录密码,是开启POP3之后设置的客户端授权码
2、 默认端口25,使用465端口时,需要添加配置:
spring.mail.port=465
spring.mail.properties.mail.smtp.ssl.enable=true
pop3 授权码开启参考: https://jingyan.baidu.com/article/ac6a9a5e13035e2b653eac26.html
qq邮箱配置
spring.mail.host=smtp.qq.com
spring.mail.username=xxx@qq.com
spring.mail.password=ooo #开启POP3之后设置的客户端授权码
spring.mail.default-encoding=UTF-8
本文使用163邮箱配置如下供参考:
spring:
email:
host: smtp.163.com
username: xxxxx@163.com
# 163邮箱密码 修改为授权码
password: xxxxxxxxxxx
auth: true
enable: true
required: true
port: 25
defaultEncoding: UTF-8
注入配置信息,新建EmailConfigEntity类和 EmailConfig 类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "spring.email")
public class EmailConfigEntity {
private String host;
private String username;
private String password;
private String auth;
private String enable;
private String required;
private int port;
private String defaultEncoding;
}
EmailConfig 类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import java.util.Properties;
@Configuration
/*@EnableConfigurationProperties(EmailConfigEntity.class)*/
public class EmailConfig {
@Autowired
private EmailConfigEntity entity;
//获取JavaMailSenderImpl 对象
@Bean
public JavaMailSenderImpl JavaMailSender(){
JavaMailSenderImpl sender = new JavaMailSenderImpl();
sender.setHost(entity.getHost().trim());
sender.setUsername(entity.getUsername().trim());
sender.setPassword(entity.getPassword().trim());
sender.setPort(entity.getPort());
sender.setProtocol("smtp");
sender.setDefaultEncoding(entity.getDefaultEncoding());
Properties properties = new Properties();
properties.setProperty("mail.smtp.auth", entity.getAuth().trim());
properties.setProperty("mail.smtp.starttls.enable", entity.getEnable().trim());
properties.setProperty("mail.smtp.starttls.required", entity.getRequired().trim());
sender.setJavaMailProperties(properties);
return sender;
}
// 实列化 email 工具
@Bean
public EmailUtil getEmailUtil(){
EmailUtil emailUtil = new EmailUtil();
emailUtil.setSender(JavaMailSender());
return emailUtil;
}
}
EmailBean 实体类
import lombok.Data;
import org.springframework.core.io.FileSystemResource;
@Data
public class EmailBean {
// 发送人
private String from;
// 接收人
private String to;
// 主题
private String subject;
// 内容
private String text;
// 附件
private FileSystemResource file;
// 附件名称
private String attachmentFilename;
// 邮件类型
private Integer type;
}
封装邮件发送类型工具类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import javax.mail.internet.MimeMessage;
public class EmailUtil {
// 日志记录
private final static Logger logger = LoggerFactory.getLogger(EmailUtil.class);
private JavaMailSenderImpl sender;
public JavaMailSenderImpl getSender() {
return sender;
}
public void setSender(JavaMailSenderImpl sender) {
this.sender = sender;
}
public void send(EmailBean bean){
try{
// 异步执行
Thread.sleep(1000);
switch(bean.getType()){
case 1:
// 简单文本邮件
SimpleMailMessage text = new SimpleMailMessage();
text.setFrom(bean.getFrom());
text.setTo(bean.getTo());
text.setSubject(bean.getSubject());
// 简单文本核心代码
text.setText(bean.getText());
sender.send(text);
break;
case 2:
// HTML邮件
MimeMessage html = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(html, true);
helper.setFrom(bean.getFrom());
helper.setTo(bean.getTo());
helper.setSubject(bean.getSubject());
// HTML 核心代码
helper.setText(bean.getText(),true);
sender.send(html);
break;
case 3:
// 附件邮件
MimeMessage attach = sender.createMimeMessage();
MimeMessageHelper attachHelper = new MimeMessageHelper(attach, true);
attachHelper.setFrom(bean.getFrom());
attachHelper.setTo(bean.getTo());
attachHelper.setSubject(bean.getSubject());
attachHelper.setText(bean.getText());
// 附件核心代码
attachHelper.addAttachment(bean.getAttachmentFilename(), bean.getFile());
sender.send(attach);
break;
}
}catch (Exception e){
logger.error(e.getMessage());
}
}
}
EmailController类
import com.example.demo.email.EmailBean;
import com.example.demo.email.EmailUtil;
import io.swagger.annotations.Api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
@RestController
@RequestMapping("/email")
@Api(tags="email 邮箱测试")
public class EmailController {
// 引入日志
private final static Logger logger = LoggerFactory.getLogger(EmailController.class);
@Autowired
private EmailUtil util;
@RequestMapping(value = "/sendText", method = RequestMethod.GET)
public void sendText() {
SimpleMailMessage mailMessage = new SimpleMailMessage();
//mailMessage.s
// 简单文本邮件发送
EmailBean text = new EmailBean();
text.setFrom("xxxx@163.com");
text.setTo("xxxxx@163.com");
text.setSubject("简单文本邮件发送");
text.setText("简单文本邮件发送");
text.setType(Integer.valueOf(1));
util.send(text);
logger.error("简单文本邮件发送成功");
}
@RequestMapping(value = "/sendHTML", method = RequestMethod.GET)
public void sendHTML() {
// 简单文本邮件发送
EmailBean text = new EmailBean();
text.setFrom("xxxx@163.com");
text.setTo("xxxxx@163.com");
text.setSubject("HTML邮件发送");
StringBuffer sb = new StringBuffer();
sb.append("<h1>HTML邮件发送</h1>")
.append("<p style='color:#F00'>红色字</p>")
.append("<p style='text-align:right'>右对齐</p>");
text.setText(sb.toString());
text.setType(Integer.valueOf(2));
util.send(text);
logger.error("HTML邮件发送成功");
}
@RequestMapping(value = "/sendAttach", method = RequestMethod.GET)
public void sendAttach() {
// 简单文本邮件发送
EmailBean text = new EmailBean();
text.setFrom("xxxx@163.com");
text.setTo("xxxxx@163.com");
text.setSubject("邮件附件发送");
text.setText("邮件附件发送");
FileSystemResource file = new FileSystemResource(new File("D:\\20180927180957106.png"));
text.setFile(file);
text.setAttachmentFilename("zheng");
text.setType(Integer.valueOf(3));
util.send(text);
logger.error("HTML邮件发送成功");
}
}
异步发送
启动类加入@EnableAsync注解开启异步:
@SpringBootApplication
@EnableAsync//开启异步
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
定义异步线程池:
@Configuration
public class TaskPoolConfig {
@Bean("taskExecutor")
public Executor taskExecutor () {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数10:线程池创建时候初始化的线程数
executor.setCorePoolSize(10);
// 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
executor.setMaxPoolSize(15);
// 缓冲队列200:用来缓冲执行任务的队列
executor.setQueueCapacity(200);
// 允许线程的空闲时间60秒:当超过了核心线程数之外的线程在空闲时间到达之后会被销毁
executor.setKeepAliveSeconds(60);
// 线程池名的前缀:设置好了之后可以方便定位处理任务所在的线程池
executor.setThreadNamePrefix("taskExecutor-");
/*
线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,
当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;
如果执行程序已关闭,则会丢弃该任务
*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
executor.setWaitForTasksToCompleteOnShutdown(true);
// 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
executor.setAwaitTerminationSeconds(600);
return executor;
}
}
在需要异步的方法上@Async 注解:
则在EmailUtil 类的 send 方法是加上 @Async(“taskExecutor”) 注解
方法在调用switch之前 加入
Thread.sleep(1000);//异步执行