如何通过java邮件将ZipInputStream作为附件发送?

如何通过java邮件将ZipInputStream作为附件发送?,java,jakarta-mail,inputstream,Java,Jakarta Mail,Inputstream,我有一个ZipInputStream。我们如何通过java mail将ZipInputStream作为附件(data.zip)发送 我见过一些解决方案,比如使用ByteArrayDatasource,但是由于MimeBodyPart作为一个构造函数接收InputStream,并且我们有一个InputStream手边,我想知道如何在不使用ByteArrayDatasource的情况下解决这个问题,我认为你提出了一个错误的问题,你真正想要的是: 如何将zip文件附加到电子邮件中 对吧??您不能附加正

我有一个
ZipInputStream
。我们如何通过java mail将
ZipInputStream
作为附件(data.zip)发送


我见过一些解决方案,比如使用
ByteArrayDatasource
,但是由于
MimeBodyPart
作为一个构造函数接收
InputStream
,并且我们有一个
InputStream
手边,我想知道如何在不使用
ByteArrayDatasource
的情况下解决这个问题,我认为你提出了一个错误的问题,你真正想要的是:

如何将zip文件附加到电子邮件中

对吧??您不能附加正在等待附加InputStream的任何对象类型(在本例中为ZipInputStream)。InputStream是一个允许按1或通过缓冲区读取字节的流

您可以使用apachecommons库commons io获取字节数组并将这些字节写入文件系统

ZipInputStream zis = ...get your stream
byte[] zipbytes = IOUtils.toByteArray(zis);
FileOutputStream fos = new FileOutputStream(new File("/path/temp.zip"));
fos.write(zipbytes);
fos.close();
我在论坛中发现了复制粘贴电子邮件的方法:

final String username = "your.mail.id@gmail.com";
    final String password = "your.password";

    Properties props = new Properties();
    props.put("mail.smtp.auth", true);
    props.put("mail.smtp.starttls.enable", true);
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.port", "587");

    Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });

    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("from.mail.id@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("to.mail.id@gmail.com"));
        message.setSubject("Testing Subject");
        message.setText("PFA");

        MimeBodyPart messageBodyPart = new MimeBodyPart();

        Multipart multipart = new MimeMultipart();

        messageBodyPart = new MimeBodyPart();
        String fileName = "attachmentName.zip"
        DataSource source = new FileDataSource(new File("/path/temp.zip"));
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(fileName);
        multipart.addBodyPart(messageBodyPart);

        message.setContent(multipart);

        System.out.println("Sending");

        Transport.send(message);

        System.out.println("Done");

    } catch (MessagingException e) {
        e.printStackTrace();
}

将数据写入文件,然后附加文件肯定会起作用,如果您不知道数据可能有多大,那么这是一个合理的选择。否则,ByteArrayDataSource将允许您将数据保存在内存中,尽管它将首先复制数据。有更复杂的答案可能有更好的性能,但这是两种简单的方法

但是,如果您只有一个ZipInputStream,我不确定是否有办法读取原始zip格式的数据,因此我认为您不能直接使用这两种方法中的任何一种。您要么需要直接访问zip文件,要么需要包含zip格式数据的真实InputStream


(不,您不会将InputStream传递给MimeBodyPart构造函数,因为它不是MIME格式的实体;您使用它来构造某种类型的数据源,从中构造一个DataHandler,您可以在MimeBodyPart上设置它。)

请添加一些代码(您尝试过的代码),然后我们就可以提供帮助了。非常感谢Bill,我想了解更多关于MIME格式实体的信息。这到底意味着什么?。你有关于MIME主体部分如何创建附件的参考资料吗?正如MIMEPartJavadocs所说:MIMEPartInterface为MIME定义的实体建模(,第2.4节)。我不知道你所说的“MIME身体部分如何创建附件”是什么意思。您是否在询问MIME消息中附件的格式?见RFC 2045。谢谢你的努力丹尼尔,我的问题只对了。由于性能问题,我不想将流转换为文件并作为附件发送。我从数据库中存储的一个blob中读取了这个Zip,此时我有一个ZipInputStream,没有转换成bytearraydatasouse,我想创建MimeBodyPart。这不仅仅是一次学习经历。。