我有ZipInputStream
。我们如何通过java mail发送ZipInputStream
作为附件(data.zip)?
我见过一些使用ByteArrayDatasource
的解决方案,但由于MimeBodyPart
收到InputStream
作为一个构造函数而我们有一个InputStream
方便,我想知道如何在不使用ByteArrayDataSource
的情况下解决此问题。
答案 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();
}