2015-06-16 3 views
1

У меня есть ZipInputStream. Как мы можем отправить ZipInputStream в виде вложения (data.zip) через java-почту?Как отправить ZipInputStream в виде вложения через java-почту?

я видел какое-то решение, как с помощью ByteArrayDatasource, но так как MimeBodyPart получает InputStream как один конструктор, и мы имеем InputStream удобные, я хотел бы знать, как решить эту проблему без использования ByteArrayDataSource.

+1

Пожалуйста, добавьте код (из того, что вы пробовали), и чем мы сможем вам помочь. –

ответ

0

Я думаю, что вы сделали неправильный вопрос, что вы действительно хотите это:

Как я могу прикрепить файл почтового индекса в электронную почту?

правый? Вы не можете присоединить какой-либо тип объекта, который вы ожидаете для присоединения InputStream (в этом случае ZipInputStream). InputStream - это Stream, который позволяет читать байты 1 на 1 или буфером.

Вы можете использовать Apache Commons библиотеки 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

Спасибо за ваши усилия Даниэль, Мой вопрос был прав только. Из-за проблемы с производительностью я не хочу конвертировать мой поток в файл и отправлять его в виде вложения. Я прочитал этот Zip из блоба, хранящегося в базе данных. В этот момент у меня есть ZipInputStream, но без преобразования в ByteArrayDataSouce я бы хотел создать MimeBodyPart. Это больше по сравнению с опытом обучения. – user2914613

2

Запись данных в файл, а затем присоединив файл, безусловно, работать, и если вы не знаете, как большие данные могут быть чем это разумный выбор. В противном случае ByteArrayDataSource позволит вам сохранить данные в памяти, хотя сначала он сделает копию данных. Есть более сложные ответы, которые могут иметь лучшую производительность, но это два простых подхода.

Однако, если у вас есть ZipInputStream, я не уверен, что есть способ прочитать необработанные данные формата zip, поэтому я не думаю, что вы можете использовать любой из этих подходов напрямую. Вам либо нужен прямой доступ к zip-файлу, либо вам нужен реальный InputStream, который содержит данные формата zip.

(И нет, вы не передаете InputStream в конструктор MimeBodyPart, поскольку он не является объектом MIME-формата, вы используете его для построения некоторого рода DataSource, из которого вы создаете DataHandler, который вы устанавливаете на MimeBodyPart.)

+0

Большое спасибо Билл, я хотел бы узнать больше об объекте формата MIME. Что это значит ?. У вас есть ссылки на то, как часть тела MIME создает приложение. – user2914613

+0

Как сообщают MimePart javadocs: Интерфейс MimePart моделирует Entity, как определено MIME ([RFC2045] (https://www.ietf.org/rfc/rfc2045.txt), раздел 2.4). Я не знаю, что вы подразумеваете под «как часть тела MIME создает приложение». Вы спрашиваете, как вложение отформатировано в сообщении MIME? См. RFC 2045. –

Смежные вопросы