2015-06-16 105 views
1

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

我曾见过这样使用ByteArrayDatasource但自从MimeBodyPart接收InputStream作为一个构造函数,我们有一个InputStream得心应手,我想知道如何解决这个问题,而无需使用ByteArrayDataSource一些解决方案。

+1

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

回答

0

我想你已经做了一个错误的问题,你真正想要的是:

我怎么能把一个zip文件到一个电子邮件?

对不对?您无法附加任何等待附加InputStream的对象类型(本例中为ZipInputStream)InputStream是允许通过1或1缓冲区读取字节的Stream。

您可以使用Apache公共图书馆的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 = "[email protected]"; 
    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("[email protected]")); 
     message.setRecipients(Message.RecipientType.TO, 
       InternetAddress.parse("[email protected]")); 
     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(); 
} 
+1

感谢您的努力Daniel,我的问题只是正确的。由于性能问题,我不想将我的流转换为文件并将其作为附件发送。我从存储在数据库中的blob中读取这个Zip,在这个时候我有一个ZipInputStream,没有被转换为ByteArrayDataSouce,我想创建MimeBodyPart。这更多的是学习经验.. – user2914613

2

将数据写入文件然后附加文件肯定会起作用,并且如果您不知道数据的大小可能比这是一个合理的选择。否则,ByteArrayDataSource将允许您将数据保存在内存中,尽管它会首先创建数据的副本。有更复杂的答案可能会有更好的表现,但这是两种简单的方法。但是,如果你只有一个ZipInputStream,我不确定是否有读取原始zip格式数据的方法,所以我不认为你可以直接使用这两种方法中的任何一种。您可能需要直接访问zip文件,或者需要一个包含zip格式数据的真正InputStream。 (不,您不会将InputStream传递给MimeBodyPart构造函数,因为它不是MIME格式实体;您可以使用它构造某种类型的DataSource,从中构建一个DataHandler,您可以在其中设置DataHandler MimeBodyPart。)

+0

非常感谢Bill,我想了解更多关于MIME格式的实体。这实际上意味着什么?你有任何关于MIME正文部分如何创建附件的参考。 – user2914613

+0

正如MimePart javadocs所说:MimePart接口根据MIME([RFC2045](https://www.ietf.org/rfc/rfc2045.txt),第2.4节)定义的实体进行建模。我不知道“MIME正文部分如何创建附件”的含义。你是问如何在MIME消息中格式化附件?请参阅RFC 2045。 –

相关问题