项目结构
主要依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--邮件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!--excel-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.7</version>
</dependency>
controller:
package cn.com.hj.mail.controller;
import cn.com.hj.mail.bean.MailBean;
import cn.com.hj.mail.common.InitThreadPoll;
import cn.com.hj.mail.mailService.MailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;
@RestController
@RequestMapping("/MailController")
public class MailController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private MailService mailService;
/**
* 发送简单邮件模式
* @return
*/
@RequestMapping("/simpMail")
public String simpMail(){
logger.info("进入 邮件发送服务");
String toMail = "h****@sift.com.cn";
String subject ="邮件服务测试";
String content = "邮件测试";
mailService.sendSimpleMail(toMail,subject,content);
return "Hello world spring boot";
}
/**
* 发送带附件邮件
* @return
*/
@RequestMapping("/simpAndFileMail")
public String simpAndFileMail(){
logger.info("进入 邮件发送服务");
String toMail = "h****@sift.com.cn";
String subject ="邮件服务加附件";
String content = "邮件测试";
String filePath="D:\\1.txt";
mailService.sendAttachmentsMail(toMail,subject,content,filePath);
return "Hello world spring boot";
}
/**
* 发送html邮件模式
* @return
*/
@RequestMapping("/simpMail_html")
public String simpHtmlMail(){
logger.info("进入 邮件发送服务");
String toMail = "h****@sift.com.cn";
String subject ="邮件服务测试 simple";
String content = "<html><head><style>td{border:solid #add9c0; border-width:0px 1px 1px 0px; padding:10px 0px;} table{border:solid #add9c0; border-width:1px 0px 0px 1px;}</style></head><body style=''><h3>xx系统中错误领导项目,项目信息如下:</h3>" +
"<table><tr><th>合同号</th><th>项目名称</th><th>客户名称</th><th>合同总金额(元)</th><th>合同实收款(元)</th><th>签订日期</th><th>项目所属领导</th><th>提交人</th></tr>" +
"<tr><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>" +
"</table></body></html>";
mailService.sendHtmlMail(toMail,subject,content);
return "Hello world spring boot";
}
/**
* 按照模板发送邮件
* @return
*/
@RequestMapping("/simpMail_Templage")
public String simpTemplageMail(){
logger.info("进入 邮件发送服务");
String toMail = "h****@sift.com.cn";
String subject ="邮件服务测试";
Map<String, Object> map = new HashMap<String, Object>();
MailBean mailBean1 = new MailBean();
mailBean1.setExName("Exception");
mailBean1.setExNum("20");
mailBean1.setTime("2019-03-20");
MailBean mailBean2 = new MailBean();
mailBean2.setExName("Exception1");
mailBean2.setExNum("20");
mailBean2.setTime("2019-03-20");
List<MailBean> list = new ArrayList<MailBean>();
list.add(mailBean1);
list.add(mailBean2);
map.put("listInfo",list);
map.put("UserName", "通知:bug如下");
map.put("titleName","bug通知");
mailService.sendTemplageMail(toMail,subject,map);
return "Hello world spring boot";
}
/**
* 测试多线程发送邮件
* @return
*/
@RequestMapping("/simpTemplageMailThread")
public String simpTemplageMailThread(){
ExecutorService executorService = InitThreadPoll.getInstance();
final Semaphore semaphore = new Semaphore(5);
List<MailBean> list = new ArrayList<MailBean>();
MailBean mailBean1 = new MailBean();
mailBean1.setExName("Exception1");
mailBean1.setExNum("20");
mailBean1.setTime("2019-03-20");
MailBean mailBean2 = new MailBean();
mailBean2.setExName("Exception2");
mailBean2.setExNum("20");
mailBean2.setTime("2019-03-20");
MailBean mailBean3 = new MailBean();
mailBean3.setExName("Exception3");
mailBean3.setExNum("20");
mailBean3.setTime("2019-03-20");
MailBean mailBean4 = new MailBean();
mailBean4.setExName("Exception4");
mailBean4.setExNum("20");
mailBean4.setTime("2019-03-20");
MailBean mailBean5 = new MailBean();
mailBean5.setExName("Exception5");
mailBean5.setExNum("20");
mailBean5.setTime("2019-03-20");
MailBean mailBean6 = new MailBean();
mailBean6.setExName("Exception6");
mailBean6.setExNum("20");
mailBean6.setTime("2019-03-20");
MailBean mailBean7 = new MailBean();
mailBean7.setExName("Exception7");
mailBean7.setExNum("20");
mailBean7.setTime("2019-03-20");
MailBean mailBean8 = new MailBean();
mailBean8.setExName("Exception8");
mailBean8.setExNum("20");
mailBean8.setTime("2019-03-20");
MailBean mailBean9 = new MailBean();
mailBean9.setExName("Exception9");
mailBean9.setExNum("20");
mailBean9.setTime("2019-03-20");
MailBean mailBean10 = new MailBean();
mailBean10.setExName("Exception10");
mailBean10.setExNum("20");
mailBean10.setTime("2019-03-20");
list.add(mailBean1);
list.add(mailBean2);
list.add(mailBean3);
list.add(mailBean4);
list.add(mailBean5);
list.add(mailBean6);
list.add(mailBean7);
list.add(mailBean8);
list.add(mailBean9);
list.add(mailBean10);
int m = list.size();
for (int i = 0; i < m; i++) {
final MailBean mailBean = list.get(i);
executorService.execute(new Runnable() {
public void run() {
try {
semaphore.acquire(); //获取一个信号量
getInfoMail(mailBean);
semaphore.release(); //释放一个信号量
}catch (InterruptedException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
});
}
return "Hello world spring boot";
}
@RequestMapping("/simpTemplageMailThreadMonitor")
public String simpTemplageMailThreadMonitor(){
logger.info("-------------------------------------");
ThreadPoolExecutor treadPoolExecutor = (ThreadPoolExecutor)InitThreadPoll.getInstance();
long taskCount = treadPoolExecutor.getTaskCount();//线程池中已执行和未执行的线程总数
int poolSize = treadPoolExecutor.getPoolSize();//线程池中当前的线程数量
int activeCount = treadPoolExecutor.getActiveCount(); //当前线程池中正在执行的线程数量
long completedTaskCount =treadPoolExecutor.getCompletedTaskCount();// 已完成的线程任务数量
int corePoolSize = treadPoolExecutor.getCorePoolSize();
return "线程池中已执行和未执行的线程总数:"+taskCount+"\n" +
"线程池中当前的线程数量:"+poolSize+"\n"+
"当前线程池中正在执行的线程数量:"+activeCount+"\n"+
"已完成的线程任务数量:"+completedTaskCount+"\n"+
"corePoolSize:"+corePoolSize+"\n";
}
@RequestMapping("/simpTemplageMailThreadNull")
public String simpTemplageMailThreadNull(){
ExecutorService executorService = InitThreadPoll.getInstance();
logger.info("{}:",executorService.isShutdown());
if(!executorService.isShutdown()){
executorService = null ;
}
return "Hello world spring boot";
}
public void getInfoMail(MailBean mailBean){
logger.info("{}",mailBean.getExName());
Map<String, Object> map = new HashMap<String, Object>();
List<MailBean> list = new ArrayList<MailBean>();
list.add(mailBean);
map.put("listInfo",list);
map.put("UserName", "通知");
map.put("titleName","标题名-测试");
String toMail = "h****@sift.com.cn";
String subject ="邮件服务测试";
mailService.sendTemplageMail(toMail,subject,map);
try{
Thread.sleep(9000);
}catch (Exception ex){
ex.printStackTrace();
}
}
@RequestMapping("/testThread")
public String testThread(){
ExecutorService executorService = InitThreadPoll.getInstance();
final Semaphore semaphore = new Semaphore(5);
final List<String> names = new ArrayList<String>();
names.add("1");
names.add("2");
names.add("3");
names.add("4");
names.add("5");
names.add("6");
names.add("7");
names.add("8");
names.add("9");
names.add("10");
for (int i = 0; i < names.size(); i++) {
final String mailBean = names.get(i);
final int j=i;
executorService.execute(new Runnable() {
public void run() {
try {
semaphore.acquire(); //获取一个信号量
try{
Thread.sleep(9000);
}catch (Exception ex){
ex.printStackTrace();
}
System.out.print(names.get(j));
semaphore.release(); //释放一个信号量
}catch (InterruptedException e) {
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
});
}
return "namesTest";
}
}
Service:
package cn.com.hj.mail.mailService;
import java.util.Map;
/**
* 处理邮件业务接口
*/
public interface MailService {
// 发送文本邮件
public void sendSimpleMail(String to, String subject, String content);
// 发送html邮件
public void sendHtmlMail(String to, String subject, String content);
//发送带附件的邮件
public void sendAttachmentsMail(String to, String subject, String content, String filePath);
//发送模板内容邮件
public void sendTemplageMail(String to, String subject, Map<String, Object> map);
}
ServiceImpl:
package cn.com.hj.mail.mailService.impl;
import cn.com.hj.mail.mailService.MailService;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.*;
/**
* 处理邮件业务类
*/
@Component
public class MailServiceImpl implements MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private FreeMarkerConfigurer fmc;
@Autowired
private JavaMailSender mailSender;
@Autowired
JdbcTemplate coreJdbcTemplate;
//读取配置文件中信息,发件人邮箱
@Value("${mail.from.info}")
private String from;
/**
* 发送文本邮件
*
* @param to
* @param subject
* @param content
*/
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
logger.info("from:"+from+" to:"+to+" subject:"+subject+" content:"+content);
} catch (Exception e) {
logger.error("发送简单邮件时发生异常!", e);
e.printStackTrace();
}
}
/**
* 发送html邮件
*
* @param to
* @param subject
* @param content
*/
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
// true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(message);
logger.info("html邮件发送成功");
} catch (MessagingException e) {
logger.error("发送html邮件时发生异常!", e);
}
}
/**
* 发送带附件的邮件
*
* @param to
* @param subject
* @param content
* @param filePath
*/
@Override
public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);
mailSender.send(message);
logger.info("带附件的邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送带附件的邮件时发生异常!", e);
}
}
/**
*发送模板内容邮件
* @param to 发送邮箱
* @param subject 邮件主题
* @param map 邮件内容
*/
public void sendTemplageMail(String[] to, String[] copyEmail, String subject, Map<String, Object> map,String templeName) throws Exception {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, true);
mimeMessageHelper.setSubject(subject==null?"":subject);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setCc(copyEmail);
mimeMessageHelper.setFrom(from);
Template t = fmc.getConfiguration().getTemplate(templeName);//获取模板
String content = FreeMarkerTemplateUtils.processTemplateIntoString(t, map);//解析模板
mimeMessageHelper.setText(content, true);
mailSender.send(message);
}
@Override
public void sendTemplageMail(String to, String subject, Map<String, Object> map) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, true);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setTo(to);
mimeMessageHelper.setFrom(from);
Template t = fmc.getConfiguration().getTemplate("mailTemplage_1.ftl");//获取模板
String content = FreeMarkerTemplateUtils.processTemplateIntoString(t, map);//解析模板
mimeMessageHelper.setText(content, true);
// mimeMessageHelper.addAttachment();
mailSender.send(message);
} catch (Exception e) {
logger.error("发送带模板的邮件时发生异常!", e);
}
}
}
MailBean:
package cn.com.hj.mail.bean;
public class MailBean {
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getExName() {
return exName;
}
public void setExName(String exName) {
this.exName = exName;
}
public String getExNum() {
return exNum;
}
public void setExNum(String exNum) {
this.exNum = exNum;
}
private String time;
private String exName;
private String exNum;
}
InitThreadPoll:
package cn.com.hj.mail.common;/**
*/
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 初始化线程池
*/
public class InitThreadPoll {
// 单例对象
private static ExecutorService executorService = null;
// 静态的工厂方法
public static ExecutorService getInstance() {
if (executorService == null) { // 双重检测机制 // B
synchronized (ExecutorService.class) { // 同步锁
if (executorService == null) {
System.out.println("重新创建对象----------------");
executorService = Executors.newCachedThreadPool(); // A - 3
}
}
}
return executorService;
}
public static void main(String[] args) {
System.out.println(getInstance().hashCode());
System.out.println(getInstance().hashCode());
}
}
#mail
spring.mail.username=10*****[email protected]
spring.mail.password=idshjdsaksa
spring.mail.host=smtp.qq.com
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
mail.from.info=10*****[email protected]