使用JavaMailSender定时发送带附件excel的邮件
最近接到一个需求,客户需要每天定时发送邮件给他。 邮件中包含查出来数据做的excel附件。 之前是有写过定时发送邮件的,但是没有附件。 然后百度一下发现都是根据路径找到文件发送,这就跟我的需求冲突了。 于是为了把excel塞到附件中纠结了好久。。 (菜鸡是这样的) 最后在easyexcel的包下面发现了FileUtils类里面有创建exce文件的方法,问题顺利解决
附代码
@Component
@Slf4j
public class SendReportTask {
@Autowired
MesExportMapper mesExportMapper;
@Autowired
private JavaMailSender javaMailSender;
@Scheduled(cron = "0 0 0,08,16 * * ?")
public void regularlyCleaned() {
log.info("报表发送开始");
MimeMessage msg = javaMailSender.createMimeMessage();
//创建MimeMessageHelper对象,处理MimeMessage的辅助类
MimeMessageHelper helper = null;
//创建附件
File excelWriter = attachmentInfo();
try {
helper = new MimeMessageHelper(msg, true);
//发信人账号
helper.setFrom(username);
//收信人账号
helper.setTo("xxxx@163.com");
helper.setSubject("测试邮件(邮件主题)");
helper.setText("这是邮件内容");
//加入附件
helper.addAttachment(MimeUtility.encodeWord("未完成表格.xlsx"), excelWriter);
} catch (Exception e) {
e.printStackTrace();
log.info("报表发送失败{}",e.getMessage());
}
// 发送邮件
javaMailSender.send(msg);
log.info("报表发送结束");
}
File attachmentInfo(){
ExcelWriter excelWriter = null;
//sheet1内容
List<UserVo> inventoryInfo = userMapper.findUser();
//生成文件
File cacheTmpFile = FileUtils.createTmpFile("未完成表格.xlsx");
try {
excelWriter = new ExcelWriterBuilder()
.file(cacheTmpFile)
.excelType(ExcelTypeEnum.XLSX)
.autoCloseStream(true)
.registerWriteHandler(new CustomCellWriteHandler())
.build();
//将数据写入sheet页中
WriteSheet writeSheet = EasyExcel.writerSheet(0, "sheet1").head(UserVo.class).build();
excelWriter.write(inventoryInfo,writeSheet);
} catch (Exception e) {
e.printStackTrace();
log.info("报表导出失败{}",e.getMessage());
}finally {
excelWriter.finish();
}
return cacheTmpFile;
}
}
配置文件
spring:
mail:
protocol: smtp #smtp是邮件发送协议,pop3和imap是邮件接收协议。因为我们要发送邮件,因此是smtp
host: smtp.163.com #邮件发送服务器的主机,这里采用的是163邮箱来发送邮件
port: 25 #邮件发送服务器的端口
auth: true #一般情况下,发送邮件都是要进行验证
username: xxxx@163.com #发邮件账号
password: xxxxxxx #邮箱秘钥
from: ${
username}
