1.引入pom依赖
<!-- 邮箱 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.4</version>
</dependency>
<!-- easyexcel-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
1.创建邮箱是实体类`
import lombok.Data;
import java.util.List;
/**
* 创建邮箱实体类
*
* @author ZL
*/
@Data
public class CreateExcelSendEmailVo<T> {
/**
* 生成excel的数据
*/
private List<T>dataList;
/**
* excel的表头
*/
private List<String> tableHeadList;
/**
* 邮件的标题
*/
private String emailTitle;
/**
* 邮件内容
*/
private String emailContent;
/**
* 邮件收件人邮箱,支持多个收件人邮箱
*/
private List<String> acceptAddressList;
}
2.工具类(这里是两个工具类,别看错了)
import com.alibaba.excel.metadata.BaseRowModel;
import org.springframework.stereotype.Component;
/**
* @author ZL
*/
@Component
public class ExcelFactory<T extends BaseRowModel> {
public ExportExcelUtil<T> createExportExcel() {
return new ExportExcelUtil<>();
}
}
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.metadata.Table;
import com.alibaba.excel.support.ExcelTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Excel创建工具类
*
* @author ZL
*/
@Component
@Slf4j
public class ExportExcelUtil<T extends BaseRowModel> {
public ExportExcelUtil() {
}
/**
* 创建excel表
*
* @param out
* @param data
* @param tableHeadList
* @throws IOException
*/
public void createExcel(ByteArrayOutputStream out, List<T> data, List<String> tableHeadList) throws IOException {
try {
List<List<String>> head = getExcelHead(tableHeadList);
ExcelWriter writer = new ExcelWriter(null, out, ExcelTypeEnum.XLSX, true);
Table table = new Table(0);
table.setHead(head);
Sheet sheet1 = new Sheet(1, 0);
sheet1.setAutoWidth(true);
sheet1.setSheetName("sheet1");
writer.write(data, sheet1, table);
writer.finish();
out.flush();
} finally {
if (out != null) {
out.close();
}
}
}
/**
* 创建excel表头
*
* @param tableHeadList
* @return
*/
private List<List<String>> getExcelHead(List<String> tableHeadList) {
List<List<String>> head = new ArrayList<List<String>>();
for (String s : tableHeadList) {
List<String> column = new ArrayList<String>();
column.add(s);
head.add(column);
}
return head;
}
}
3.创建邮箱业务类
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.Properties;
/**
* 创建邮箱业务类
*
* @author ZL
*/
@Component
@Slf4j
public class EmailService {
@Value("${email.userName:null}")
private String userName;
@Value("${email.passWord:null}")
private String passWord;
/**
* 消息发送方法
* @param acceptAddressList
* @param title
* @param text
* @param affixName
* @param inputstream
*/
public void sendMsgFileDs(List<String> acceptAddressList, String title, String text, String affixName, ByteArrayInputStream inputstream) {
Session session = assembleSession();
Message msg = new MimeMessage(session);
try {
msg.setFrom(new InternetAddress(userName));
msg.setSubject(title);
Address[] addressArr = acceptAddressList(acceptAddressList);
msg.setRecipients(Message.RecipientType.TO, addressArr);
MimeBodyPart contentPart = (MimeBodyPart) createContent(text, inputstream, affixName);//参数为正文内容和附件流
MimeMultipart mime = new MimeMultipart("mixed");
mime.addBodyPart(contentPart);
msg.setContent(mime);
Transport.send(msg);
} catch (Exception e) {
log.error("创建消息失败,{}",e);
}
}
/**
* 创建邮件消息接收者
*
* @param acceptAddressList
* @return
*/
public Address[] acceptAddressList(List<String> acceptAddressList) {
Address[] tos = new InternetAddress[acceptAddressList.size()];
try {
for (int i = 0; i < acceptAddressList.size(); i++) {
tos[i] = new InternetAddress(acceptAddressList.get(i));
}
} catch (AddressException e) {
log.error("创建邮件消息接收者失败,{}",e);
}
return tos;
}
/**
* 以QQ邮箱为例,邮箱配置类
*
* @return
*/
public Session assembleSession() {
String host = "host";
String mailStoreType = "smtp";
String popPort = "587";
final Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", host);
props.put("mail.store.protocol", mailStoreType);
props.put("mail.smtp.port", popPort);
//开启SSL
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.socketFactory.port", popPort);
props.put("mail.smtp.socketFactory.fallback", "false");
Session session = Session.getDefaultInstance(props, new MyAuthenricator(userName, passWord));
return session;
}
/**
* 输出的excel文件配置
*
* @param content
* @param inputstream
* @param affixName
* @return
*/
static Part createContent(String content, ByteArrayInputStream inputstream, String affixName) {
MimeBodyPart contentPart = null;
try {
contentPart = new MimeBodyPart();
MimeMultipart contentMultipart = new MimeMultipart("related");
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(content, "text/html;charset=gbk");
contentMultipart.addBodyPart(htmlPart);
//附件部分
MimeBodyPart excelBodyPart = new MimeBodyPart();
DataSource dataSource = new ByteArrayDataSource(inputstream, "application/excel");
DataHandler dataHandler = new DataHandler(dataSource);
excelBodyPart.setDataHandler(dataHandler);
excelBodyPart.setFileName(MimeUtility.encodeText(affixName));
contentMultipart.addBodyPart(excelBodyPart);
contentPart.setContent(contentMultipart);
} catch (Exception e) {
e.printStackTrace();
}
return contentPart;
}
/**
* 用户名密码验证,需要实现抽象类Authenticator的抽象方法PasswordAuthentication
* 注意:这里的用户密码不是邮箱登录密码,而是授权码
*/
static class MyAuthenricator extends Authenticator {
String u = null;
String p = null;
public MyAuthenricator(String u, String p) {
this.u = u;
this.p = p;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(u, p);
}
}
}
4.邮件发送工具类
import com.alibaba.excel.metadata.BaseRowModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Random;
/**
* 邮件发送工具类
*
* @author ZL
*/
@Component
@Slf4j
public class EmailUtil<T extends BaseRowModel> {
@Autowired
private ExcelFactory excelFactory;
@Autowired
private EmailService emailService;
/**
* @Author ZL
* @Describetion 发送邮件的入口方法
*/
public void sendEmail(CreateExcelSendEmailVo vo) {
try {
log.info("开始发送邮件: {}", vo);
generateExcelSendEmail(vo.getDataList(), vo.getTableHeadList(), vo.getAcceptAddressList(), vo.getEmailTitle(), vo.getEmailContent());
log.info("发送邮件成功");
} catch (Exception e) {
log.info("发送邮件失败", e);
}
}
/**
* @Author ZL
* @Describetion 生成excel并发送邮件
*/
public void generateExcelSendEmail(List<T> dataList, List<String> tableHeadList, List<String> acceptAddressList, String emailTitle, String content) {
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
String fileName = "email_" + new Random().nextInt(10000) + System.currentTimeMillis() + ".xlsx";
//生成excel
excelFactory.createExportExcel().createExcel(out, dataList, tableHeadList);
// 发送邮件
emailService.sendMsgFileDs(acceptAddressList, emailTitle, content, fileName, new ByteArrayInputStream(out.toByteArray()));
} catch (Exception e) {
log.error("发送邮件时出错:{}", e);
}
}
}
4.测试(以上代码可直接使用)
/**
* 测试
*/
@Test
public void test() {
CreateExcelSendEmailVo vo = new CreateExcelSendEmailVo<>();
// 1.构建导出数据内容,这里我是查询自己的用户表
List<Usre> usreList = userService.getUserList;
vo.setDataList(usreList);
// 2.设置表头
List<String> headList = new ArrayList<>();
headList.add("姓名");
headList.add("年龄");
vo.setTableHeadList(headList);
// 3.设置email的title
vo.setEmailTitle("测试");
//4.设置email的内容
vo.setEmailContent("学生表");
// 5.设置收件人
List<String> acceptAddressList = new ArrayList<>();
acceptAddressList.add("xxx@qq.com");
vo.setAcceptAddressList(acceptAddressList);
// 6.发送邮件
emailUtil.sendEmail(vo);
}