使用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}
经验分享 程序员 微信小程序 职场和发展