Java 如何使用Spring boot创建pdf文件并发送电子邮件

Java 如何使用Spring boot创建pdf文件并发送电子邮件,java,spring,spring-boot,email-attachments,Java,Spring,Spring Boot,Email Attachments,我有一个控制器和一个导出器类,可以在SpringBoot中创建一个类数据的pdf。它在本地主机上工作。我可以通过此链接发送带有附件的电子邮件,这些附件位于resources/static/目录中: 我想通过电子邮件发送在fly创建的pdf文件。我试着把它们结合起来,但没用 public String sendMail(EmailRequestDto request, Map<String, String> model) { String response;

我有一个控制器和一个导出器类,可以在SpringBoot中创建一个类数据的pdf。它在本地主机上工作。我可以通过此链接发送带有附件的电子邮件,这些附件位于resources/static/目录中:

我想通过电子邮件发送在fly创建的pdf文件。我试着把它们结合起来,但没用

 public String sendMail(EmailRequestDto request, Map<String, String> model) {
 
        String response;
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED,
                    StandardCharsets.UTF_8.name());
           
            Template template = configuration.getTemplate("email.ftl");
            String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
 
            helper.setTo(request.getTo());
            helper.setFrom(request.getFrom());
            helper.setSubject(request.getSubject());
            helper.setText(html, true);
            
            List<PurchaseDetail> cities = (List<PurchaseDetail>)basketService.getPurchases();
                      
                      ByteArrayInputStream bis = InvoicePdfExporter.citiesReport(cities);
                      
                      HttpHeaders headers = new HttpHeaders(); headers.add("ContentDisposition",
                      "inline; filename=citiesreport.pdf");
                      InputStreamResource rs= (new InputStreamResource(bis)) ;
            
            //this gives error because rs is a inputStreamResource but not InputStream
helper.addAttachment("citiesreport.pdf",newByteArrayResource(IOUtils.toByteArray(rs)));
 
            mailSender.send(message);
            response = "Email has been sent to :" + request.getTo();
        } catch (MessagingException | IOException | TemplateException e) {
            response = "Email send failure to :" + request.getTo();
        }
        return response;
    }
publicstringsendmail(EmailRequestDto请求,映射模型){
字符串响应;
MimeMessage message=mailssender.createMimeMessage();
试一试{
MimeMessageHelper=新的MimeMessageHelper(消息,MimeMessageHelper.MULTIPART\u MODE\u MIXED\u相关,
StandardCharsets.UTF_8.name());
Template=configuration.getTemplate(“email.ftl”);
字符串html=FreeMarkerTemplateUtils.processTemplateIntoString(模板,模型);
setTo(request.getTo());
setFrom(request.getFrom());
setSubject(request.getSubject());
setText(html,true);
List cities=(List)basketService.getPurchases();
ByteArrayInputStream bis=发票PDFExporter.citiesReport(城市);
HttpHeaders headers=新建HttpHeaders();headers.add(“ContentDisposition”,
“inline;filename=citiesreport.pdf”);
InputStreamResource rs=(新的InputStreamResource(bis));
//这会产生错误,因为rs是InputStream资源,但不是InputStream
addAttachment(“citiesreport.pdf”,newByteArrayResource(IOUtils.toByteArray(rs));
发送(消息);
response=“电子邮件已发送至:”+request.getTo();
}捕获(MessaginException | IOException | TemplateException e){
response=“电子邮件发送失败:”+request.getTo();
}
返回响应;
}
我的工作控制器类创建pdf。InvoicePdfExporter类将datatable添加到文档中,并以return new ByteArrayInputStream(out.toByteArray())的形式返回:

@RequestMapping(value=“/pdfreport”,method=RequestMethod.GET,
products=MediaType.APPLICATION\u PDF\u值)
public ResponseEntity citiesReport()引发IOException
{
清单采购=(清单)
basketService.getPurchases();
ByteArrayInputStream bis=发票PDFExporter.citiesReport(采购);
HttpHeaders headers=新建HttpHeaders();headers.add(“内容处置”,
“inline;filename=citiesreport.pdf”);
返回
ResponseEntity.ok().headers(headers).contentType(MediaType.APPLICATION_PDF)
.body(新输入流资源(bis));}
}
我真的需要帮助我真的不明白从IOStreams,我尝试了很多事情,但没有一个解决我的问题。谢谢

编辑: 我通过将InvoicePdfExporter的返回类型更改为InputStreamSource解决了此问题,并更改为:

List<PurchaseDetail> cities = (List<PurchaseDetail>)basketService.getPurchases();
                      
      InputStreamSource bis =InvoicePdfExporter.citiesReport(cities);
                      
                      
    HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition",
                      "inline; filename=citiesreport.pdf");
                      
                      
                      
            helper.addAttachment("citiesreport.pdf",bis, "application/pdf" );
List cities=(List)basketService.getPurchases();
InputStreamSource bis=InvoicePdfExporter.citiesReport(城市);
HttpHeaders=新的HttpHeaders();headers.add(“内容处置”,
“inline;filename=citiesreport.pdf”);
helper.addAttachment(“citiesreport.pdf”,bis,“application/pdf”);
List<PurchaseDetail> cities = (List<PurchaseDetail>)basketService.getPurchases();
                      
      InputStreamSource bis =InvoicePdfExporter.citiesReport(cities);
                      
                      
    HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition",
                      "inline; filename=citiesreport.pdf");
                      
                      
                      
            helper.addAttachment("citiesreport.pdf",bis, "application/pdf" );