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

时间:2015-06-16 19:09:42

标签: java javamail inputstream

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

如何将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();
}