我有一个ZipInputStream
。我们如何通过java邮件发送ZipInputStream
作为附件(data.zip)?如何通过java邮件发送ZipInputStream作为附件?
我曾见过这样使用ByteArrayDatasource
但自从MimeBodyPart
接收InputStream
作为一个构造函数,我们有一个InputStream
得心应手,我想知道如何解决这个问题,而无需使用ByteArrayDataSource
一些解决方案。
我有一个ZipInputStream
。我们如何通过java邮件发送ZipInputStream
作为附件(data.zip)?如何通过java邮件发送ZipInputStream作为附件?
我曾见过这样使用ByteArrayDatasource
但自从MimeBodyPart
接收InputStream
作为一个构造函数,我们有一个InputStream
得心应手,我想知道如何解决这个问题,而无需使用ByteArrayDataSource
一些解决方案。
我想你已经做了一个错误的问题,你真正想要的是:
我怎么能把一个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();
}
感谢您的努力Daniel,我的问题只是正确的。由于性能问题,我不想将我的流转换为文件并将其作为附件发送。我从存储在数据库中的blob中读取这个Zip,在这个时候我有一个ZipInputStream,没有被转换为ByteArrayDataSouce,我想创建MimeBodyPart。这更多的是学习经验.. – user2914613
将数据写入文件然后附加文件肯定会起作用,并且如果您不知道数据的大小可能比这是一个合理的选择。否则,ByteArrayDataSource将允许您将数据保存在内存中,尽管它会首先创建数据的副本。有更复杂的答案可能会有更好的表现,但这是两种简单的方法。但是,如果你只有一个ZipInputStream,我不确定是否有读取原始zip格式数据的方法,所以我不认为你可以直接使用这两种方法中的任何一种。您可能需要直接访问zip文件,或者需要一个包含zip格式数据的真正InputStream。 (不,您不会将InputStream传递给MimeBodyPart构造函数,因为它不是MIME格式实体;您可以使用它构造某种类型的DataSource,从中构建一个DataHandler,您可以在其中设置DataHandler MimeBodyPart。)
非常感谢Bill,我想了解更多关于MIME格式的实体。这实际上意味着什么?你有任何关于MIME正文部分如何创建附件的参考。 – user2914613
正如MimePart javadocs所说:MimePart接口根据MIME([RFC2045](https://www.ietf.org/rfc/rfc2045.txt),第2.4节)定义的实体进行建模。我不知道“MIME正文部分如何创建附件”的含义。你是问如何在MIME消息中格式化附件?请参阅RFC 2045。 –
请添加一些代码(您尝试过的),并且比我们能够提供帮助。 –