por leer enviar correos correo con como archivo adjunto java attachment javamail

leer - Descargar archivos adjuntos usando Java Mail



enviar correo java archivo adjunto (5)

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<File> attachments;

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


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();


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

private static void attachments( final BodyPart body, final BiConsumer<String, InputStream> 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<String, InputStream> 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); } }


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<InputStream> getAttachments(Message message) throws Exception { Object content = message.getContent(); if (content instanceof String) return null; if (content instanceof Multipart) { Multipart multipart = (Multipart) content; List<InputStream> result = new ArrayList<InputStream>(); for (int i = 0; i < multipart.getCount(); i++) { result.addAll(getAttachments(multipart.getBodyPart(i))); } return result; } return null; } private List<InputStream> getAttachments(BodyPart part) throws Exception { List<InputStream> result = new ArrayList<InputStream>(); 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<InputStream>(); } } 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; }


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 } }


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

List<File> attachments = new ArrayList<File>(); 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); } }