在阅读本文前,可以先阅读我的上一篇文章: SpringBoot,使用JavaMailSender发送邮件(含源码)。 ,本文使用的代码案例涉及到的 jar包、application.properties配置与它相同。
先看一下效果。
图一
图二
在下方代码案例中,我使用 Hutool 工具包生成Excel文件,并将其转化成 InputStream流,之后生成对应的 javax.mail.util.ByteArrayDataSource,添加到邮件附件中。需要说明的是,邮件附件中Excel文件后缀名目前只支持 “.xls”,不支持 “.xlsx” 。
获取 Excel文件输入流工具函数
/**
* 获取 Excel文件输入流.
*
* @param sourceList 数据来源集合
* @param beanClass 导出文件类型.
*
* @return java.io.InputStream
* @author DY41220 2023/10/18 14:58
*/
public static <T, K> ByteArrayInputStream getExcelInputStream(List<T> sourceList, Class<K> beanClass) {
Assert.isFalse(CollectionUtils.isEmpty(sourceList), "源数据为空,异常!");
List<K> exportVOS = sourceList.stream().map(infoVO -> MyBeanUtils.convert(infoVO, beanClass)).collect(Collectors.toList());
Assert.isFalse(CollectionUtils.isEmpty(exportVOS), "转换后导出的数据为空,异常!");
// Map<'英文名', '中文名'> 组合形式.
Map<String, String> aliasMap = ExcelUtils.getDTOAliasTitle(beanClass, Constant.BooleanFlag.FALSE);
ExcelWriter writer = ExcelUtils.initExcelWriter(exportVOS, aliasMap);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
writer.flush(outputStream, Constant.BooleanFlag.TRUE);
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
return inputStream;
}
邮件附件中含Excel文件,进行发送。
/**
* 邮件附件中含Excel文件,进行发送。
*
* @return void
* @author moon 2023/10/18 17:10
*/
@Test
public void sendExcelAttachmentsMail() {
// 1、数据简单封装
User user1 = new User(1L, "张三", 20, new Date());
User user2 = new User(5L, "李四", 21, new Date());
User user3 = new User(6L, "王五", 18);
List<User> targetVOList = Arrays.asList(user1, user2, user3);
// 2、获取 Excel文件输入流
ByteArrayInputStream inputStream = ExcelUtils.getExcelInputStream(targetVOList, UserExportVO.class);
// 3、设置 邮件附件名
String attachmentFilename = "用户错误数据" + DateUtil.format(new Date(), Constant.DatePattern.PURE_DATETIME_PATTERN) + Constant.ExcelProperty.XLS_SUFFIX;
// 4、构建 邮件发送DTO对象
EmailDTO emailDTO = new EmailDTO(new String[] {"12345678@qq.com"}, "邮件附件中含Excel文件测试", "这是一个测试,祝自己早日学有所成。", attachmentFilename, inputStream);
// 5、发送邮件
sendAttachmentsMail(emailDTO);
log.info("邮件附件中含Excel文件,邮件发送成功~~~~~");
}
/**
* 邮件附件,发送消息。
*
* @param emailDTO
* @return void
* @author DY41220 2023/10/18 14:43
*/
public void sendAttachmentsMail(EmailDTO emailDTO) {
Assert.isFalse(Objects.isNull(emailDTO.getToArray()),"必须设置收件人!");
//获取MimeMessage对象
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message, true);
// 邮件发送人
messageHelper.setFrom(from);
// 邮件接收人
messageHelper.setTo(emailDTO.getToArray());
// 邮件主题
message.setSubject(emailDTO.getSubject());
// 邮件内容,html格式
messageHelper.setText(emailDTO.getText(), Constant.BooleanFlag.TRUE);
ByteArrayDataSource file = new ByteArrayDataSource(emailDTO.getInputStream(), Constant.HttpMessage.HTTP_SERVLET_RESPONSE_EXCEL_CONTENT_TYPE);
// 附件
messageHelper.addAttachment(MimeUtility.encodeWord(emailDTO.getAttachmentFilename(), Constant.HttpMessage.UTF_LOWER,"B"), file);
// 发送
mailSender.send(message);
//日志信息
log.info("邮件已经发送。");
} catch (Exception e) {
log.error("发送邮件时发生异常!", e);
}
}
源码路径: springboot-mail 项目 ,SpringBoot2.x--翟永超/springboot-mail 项目中,参考 com.moon.EmailApplicationTests 单元测试类。
参考文章:
1、SpringBoot,使用JavaMailSender发送邮件(含源码)。
2、Java后台生成Excel文件并作为邮件附件发送
3、