我要从邮局搬到雅加达.

https://docs.openrewrite.org/recipes/java/migrate/jakarta/javaxmailtojakartamail

或与IntelliJ合作

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
...snip


        try {
           MimeMessagePreparator messagePreparator = mimeMessage -> {
                MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
                messageHelper.setFrom("4flutteratk@gmail.com");
                messageHelper.setTo(InternetAddress.parse("4flutteratk@gmail.com"));
                messageHelper.setSubject("error log");
                messageHelper.setText(" Please find attachment:");

                //attachment
                byte[] data;
                if (emailDTO.getIsForCheckIn()) {
                    data = pdfService.generatePDFForCheckIn(emailDTO);
                } else if (emailDTO.getIsForPaymentRefund()) {
                    data = pdfService.generatePDFForRefund(emailDTO);
                } else {
                    data = pdfService.generatePDFForOnlineBooking(emailDTO);
                }

                String fileName = String.format("Booking-%s.pdf",emailDTO.getOnlineRentSell().get_id()).replace(":","");
                ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
                messageHelper.addAttachment(fileName, new InputStreamResource(byteArrayInputStream) );
            };

            // Sending the mail
            javaMailSender.send(messagePreparator);
        }

        // Catch block to handle MessagingException
        catch (Exception ex) {
            log.error(ex);
        }

这会导致错误:

传入的资源包含开放流:无效参数.Java Mail 需要一个InputStreamSource,它 for each 打电话.

它与本地文件一起工作

FileSystemResource file = new FileSystemResource("/Users/work2/Documents/GitHub/srr-all6/srr-online-shop-backend/src/main/resources/error.jpeg");
messageHelper.addAttachment(file.getFilename(), file);

但不是从字节开始

ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
// ByteArrayResource byteArrayResource = new ByteArrayResource(data);
String fileName = String.format("Booking-%s.pdf",emailDTO.getOnlineRentSell().get_id()).replace(":","");
// ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
messageHelper.addAttachment(fileName, new InputStreamResource(byteArrayInputStream) );

工作但损坏的TMP文件:

File tempFile = File.createTempFile(prefix, ".pdf", null);
tmpFilename.set(tempFile.getAbsolutePath());
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(byteArray);

FileSystemResource file = new FileSystemResource(tmpFilename.get());

messageHelper.addAttachment(fileName, file);

谁能给我指个可行的解决方案.

推荐答案

您需要使用ByteArrayResource,而不是将字节数组包装在ByteArrayInputStream中,然后将其包装在InputStreamResource中.

ByteArrayResource人的文档甚至有益地指出(重点是我的):

用于从任何给定的字节数组加载内容,而无需 若要求助于单一使用的InputStreamResource,请执行以下操作.Particularly useful for creating mail attachments from local content, where JavaMail needs to be able to read the stream multiple times.

(Java Mail是JakartaMail的旧名称.)

Java相关问答推荐

@从类文件中删除JsonProperty—Java

SQlite for Android无法使用json_group_array/json_object

在for—each循环中的AnimationTimer中的if语句'

如何调用Firebase Realtime Database中的子图像列表到android studio中的回收器视图?

ApachePOI:不带换行的新行

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

将数组整体转换为链接表

JVM会优化这个数学运算吗?

现场观看Android Studio中的变化

Java中实现的归并排序算法给出ArrayIndexOutOfBound异常

如何创建同一类的另一个对象,该对象位于变量中?

Spring Data JPA慢慢地创建了太多非活动会话

用OSQL创建索引

基于接口的投影、原生查询和枚举

Java泛型类方法的静态返回类型是否被类型擦除?

基于配置switch 的@Controller的条件摄取

S数学.exp的相同错误保证也适用于StrictMath.exp吗?

为什么创建Java动态代理需要接口参数

双对象供应商

在数组列表中找到对象后,未从数组中删除对象