【问题标题】:How to send ZipInputStream as attachment via java mail?如何通过 java 邮件将 ZipInputStream 作为附件发送?
【发布时间】:2015-06-16 19:09:42
【问题描述】:

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

我见过一些解决方案,比如使用ByteArrayDatasource,但由于MimeBodyPart 接收InputStream 作为一个构造函数,我们有一个方便的InputStream,我想知道如何在不使用ByteArrayDataSource 的情况下解决这个问题.

【问题讨论】:

  • 请添加一些代码(您尝试过的),我们将能够提供帮助。

标签: java jakarta-mail inputstream


【解决方案1】:

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

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

(不,您不会将 InputStream 传递给 MimeBodyPart 构造函数,因为它不是 MIME 格式实体;您可以使用它来构造某种 DataSource,从中构造 DataHandler,然后在 MimeBodyPart 上设置.)

【讨论】:

  • 非常感谢 Bill ,我想了解更多关于 MIME 格式实体的信息。这实际上意味着什么?您对 MIME 正文部分如何创建附件有任何参考吗?
  • 正如 MimePart javadocs 所说:MimePart 接口为 MIME 定义的实体建模(RFC2045,第 2.4 节)。我不知道“MIME 正文部分如何创建附件”是什么意思。您是否在询问附件在 MIME 消息中的格式?请参阅 RFC 2045。
【解决方案2】:

我认为你提出了一个错误的问题,你真正想要的是:

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

对吗?您不能附加任何您正在等待附加 InputStream 的对象类型(在这种情况下为 ZipInputStream),InputStream 是一个允许逐个读取字节或按缓冲区读取字节的流。

您可以使用 apache commons library 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();
}

【讨论】:

  • 感谢您的努力丹尼尔,我的问题只是正确的。由于性能问题,我不想将我的流转换为文件并将其作为附件发送。我从存储在数据库中的 blob 中读取了这个 Zip,此时我有一个 ZipInputStream,没有被转换为 ByteArrayDataSouce,我想创建 MimeBodyPart。这更多的是学习经验..
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2021-07-18
  • 2015-06-20
相关资源
最近更新 更多