Descargar archivos adjuntos usando Java Mail

Ahora que descargué todos los mensajes, y los guardo en

Message[] temp; 

¿Cómo obtengo la lista de archivos adjuntos para cada uno de esos mensajes?

 List attachments; 

Nota: no hay librerías de terceros, solo JavaMail.

Sin manejo de excepción, pero aquí va:

 List attachments = new ArrayList(); for (Message message : temp) { Multipart multipart = (Multipart) message.getContent(); for (int i = 0; i < multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); if(!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition()) && StringUtils.isBlank(bodyPart.getFileName())) { continue; // dealing with attachments only } InputStream is = bodyPart.getInputStream(); File f = new File("/tmp/" + bodyPart.getFileName()); FileOutputStream fos = new FileOutputStream(f); byte[] buf = new byte[4096]; int bytesRead; while((bytesRead = is.read(buf))!=-1) { fos.write(buf, 0, bytesRead); } fos.close(); attachments.add(f); } } 

La pregunta es muy antigua, pero tal vez ayude a alguien. Me gustaría expandir la respuesta de David Rabinowitz.

 if(!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) 

no debe devolver todos los archivos adjuntos como espera, ya que puede tener correo donde la parte mixta no tenga una disposición definida.

  ----boundary_328630_1e15ac03-e817-4763-af99-d4b23cfdb600 Content-Type: application/octet-stream; name="00000000009661222736_236225959_20130731-7.txt" Content-Transfer-Encoding: base64 

entonces en este caso, también puedes verificar el nombre del archivo. Me gusta esto:

 if (!Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition()) && StringUtils.isBlank(part.getFileName())) {...} 

EDITAR

hay un código de trabajo completo que usa la condición descrita anteriormente. Como cada parte puede encapsular otras partes y el archivo adjunto debe anidarse, la recursividad se usa para atravesar todas las partes

 public List getAttachments(Message message) throws Exception { Object content = message.getContent(); if (content instanceof String) return null; if (content instanceof Multipart) { Multipart multipart = (Multipart) content; List result = new ArrayList(); for (int i = 0; i < multipart.getCount(); i++) { result.addAll(getAttachments(multipart.getBodyPart(i))); } return result; } return null; } private List getAttachments(BodyPart part) throws Exception { List result = new ArrayList(); Object content = part.getContent(); if (content instanceof InputStream || content instanceof String) { if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition()) || StringUtils.isNotBlank(part.getFileName())) { result.add(part.getInputStream()); return result; } else { return new ArrayList(); } } if (content instanceof Multipart) { Multipart multipart = (Multipart) content; for (int i = 0; i < multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); result.addAll(getAttachments(bodyPart)); } } return result; } 

Algún ahorro de tiempo para el código donde guarda el archivo adjunto:

con javax mail versión 1.4 y después, puedes decir

 bodyPart.saveFile("/tmp/" + bodyPart.getFileName()); 

en lugar de

  InputStream is = bodyPart.getInputStream(); File f = new File("/tmp/" + bodyPart.getFileName()); FileOutputStream fos = new FileOutputStream(f); byte[] buf = new byte[4096]; int bytesRead; while((bytesRead = is.read(buf))!=-1) { fos.write(buf, 0, bytesRead); } fos.close(); 

Simplemente puede utilizar Apache Commons Mail API MimeMessageParser – getAttachmentList () a lo largo de Commons IO y Commons Lang.

 MimeMessageParser parser = .... parser.parse(); for(DataSource dataSource : parser.getAttachmentList()) { if (StringUtils.isNotBlank(dataSource.getName())) {} //use apache commons IOUtils to save attachments IOUtils.copy(dataSource.getInputStream(), ..dataSource.getName()...) } else { //handle how you would want attachments without file names //ex. mails within emails have no file name } } 

Aquí está mi interpretación de la solución de Mefi .

 private static void attachments( final BodyPart body, final BiConsumer consumer) throws MessagingException, IOException { final Multipart content; try { content = (Multipart) body.getContent(); for (int i = 0; i < content.getCount(); i++) { attachments(content.getBodyPart(i), consumer); } return; } catch (final ClassCastException cce) { } if (!Part.ATTACHMENT.equalsIgnoreCase(body.getDisposition())) { return; } final String name = body.getFileName(); if (name == null || name.trim().isEmpty()) { return; } try (final InputStream stream = body.getInputStream()) { consumer.accept(name, stream); } } public static void attachments( final Message message, final BiConsumer consumer) throws IOException, MessagingException { final Multipart content; try { content = (Multipart) message.getContent(); } catch (final ClassCastException cce) { return; } for (int i = 0; i < content.getCount(); i++) { attachments(content.getBodyPart(i), consumer); } } 
    Intereting Posts