varios sending images imagen enviar electronicos destinatarios desde correos correo con cid autenticar archivo adjunto java mime mime-types javamail multipart

sending - javamail enviar correos electronicos desde java



Imágenes en línea en correo electrónico usando JavaMail (7)

Quiero enviar un correo electrónico con una imagen en línea usando javamail.

Estoy haciendo algo como esto.

MimeMultipart content = new MimeMultipart("related"); BodyPart bodyPart = new MimeBodyPart(); bodyPart.setContent(message, "text/html; charset=ISO-8859-1"); content.addBodyPart(bodyPart); bodyPart = new MimeBodyPart(); DataSource ds = new ByteArrayDataSource(image, "image/jpeg"); bodyPart.setDataHandler(new DataHandler(ds)); bodyPart.setHeader("Content-Type", "image/jpeg; name=image.jpg"); bodyPart.setHeader("Content-ID", "<image>"); bodyPart.setHeader("Content-Disposition", "inline"); content.addBodyPart(bodyPart); msg.setContent(content);

También he intentado

bodyPart.setHeader("inline; filename=image.jpg");

y

bodyPart.setDisposition("inline");

pero pase lo que pase, la imagen se envía como archivo adjunto y la Disposición de contenido se está convirtiendo en "archivo adjunto".

¿Cómo envío una imagen en línea en el correo electrónico usando javamail?


Tu problema

Por lo que puedo ver, parece la forma en que creas el mensaje y todo está correcto. Usas los tipos MIME correctos y todo.

No estoy seguro de por qué usa un DataSource y un DataHandler, y tengo un ContentID en la imagen, pero necesita completar su pregunta para que pueda solucionar más. Especialmente, la siguiente línea:

bodyPart.setContent(message, "text/html; charset=ISO-8859-1");

¿Qué hay en el message ? ¿Contiene <img src="cid:image" /> ?

¿Intentó generar el ContentID con String cid = ContentIdGenerator.getContentId(); en lugar de usar la image

Fuente

Este artículo del blog me enseñó a usar el tipo de mensaje correcto, adjuntar mi imagen y consultar el archivo adjunto del cuerpo HTML: Cómo enviar correos electrónicos con imágenes incrustadas utilizando Java

Detalles

Mensaje

Tienes que crear tu contenido usando la clase MimeMultipart . Es importante usar la cadena "related" como parámetro para el constructor, para decirle a JavaMail que sus partes están "trabajando juntas" .

MimeMultipart content = new MimeMultipart("related");

Identificador de contenido

Debe generar un ContentID, es una cadena que se utiliza para identificar la imagen que adjuntó a su correo electrónico y remitirla desde el cuerpo del correo electrónico.

String cid = ContentIdGenerator.getContentId();

Nota: esta clase ContentIdGenerator es hipotética. Puede crear uno o en línea la creación de identificadores de contenido. En mi caso, utilizo un método simple:

import java.util.UUID; // ... String generateContentId(String prefix) { return String.format("%s-%s", prefix, UUID.randomUUID()); }

Cuerpo HTML

El código HTML es una parte del contenido de MimeMultipart . Usa la clase MimeBodyPart para eso. ¡No olvide especificar la encoding y "html" cuando configure el texto de esa parte!

MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setText("" + "<html>" + " <body>" + " <p>Here is my image:</p>" + " <img src=/"cid:" + cid + "/" />" + " </body>" + "</html>" ,"US-ASCII", "html"); content.addBodyPart(htmlPart);

Tenga en cuenta que como fuente de la imagen, usamos cid: y el ContentID generado.

Adjunto de imagen

Podemos crear otro MimeBodyPart para el archivo adjunto de la imagen.

MimeBodyPart imagePart = new MimeBodyPart(); imagePart.attachFile("resources/teapot.jpg"); imagePart.setContentID("<" + cid + ">"); imagePart.setDisposition(MimeBodyPart.INLINE); content.addBodyPart(imagePart);

Tenga en cuenta que usamos el mismo ContentID entre < y > y lo configuramos como el ContentID de la imagen. También establecemos la disposición a INLINE para indicar que esta imagen debe mostrarse en el correo electrónico, no como un archivo adjunto.

Mensaje final

¡Eso es! Si crea un mensaje SMTP en la sesión correcta y utiliza ese contenido, su correo electrónico contendrá una imagen incrustada. Por ejemplo:

SMTPMessage m = new SMTPMessage(session); m.setContent(content); m.setSubject("Mail with embedded image"); m.setRecipient(RecipientType.TO, new InternetAddress("[email protected]")); Transport.send(m)

¡Déjame saber si eso funciona para ti! ;)


¿Por qué no intentas algo como esto?

MimeMessage mail = new MimeMessage(mailSession); mail.setSubject(subject); MimeBodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setContent(message, "text/html"); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(new File("complete path to image.jpg")); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(fileAttachment.getName()); messageBodyPart.setDisposition(MimeBodyPart.INLINE); multipart.addBodyPart(messageBodyPart); mail.setContent(multipart);

en el mensaje, tenga una <img src="image.jpg"/> y debería estar bien.

Buena suerte


Abajo está el Código completo

import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; private BodyPart createInlineImagePart() { MimeBodyPart imagePart =null; try { ByteArrayOutputStream baos=new ByteArrayOutputStream(10000); BufferedImage img=ImageIO.read(new File(directory path,"sdf_email_logo.jpg")); ImageIO.write(img, "jpg", baos); baos.flush(); String base64String=Base64.encode(baos.toByteArray()); baos.close(); byte[] bytearray = Base64.decode(base64String); InternetHeaders headers = new InternetHeaders(); headers.addHeader("Content-Type", "image/jpeg"); headers.addHeader("Content-Transfer-Encoding", "base64"); imagePart = new MimeBodyPart(headers, bytearray); imagePart.setDisposition(MimeBodyPart.INLINE); imagePart.setContentID("&lt;sdf_email_logo&gt;"); imagePart.setFileName("sdf_email_logo.jpg"); } catch(Exception exp) { logError("17", "Logo Attach Error : "+exp); } return imagePart; } MimeMultipart mp = new MimeMultipart(); //mp.addBodyPart(createInlineImagePart()); mp.addBodyPart(createInlineImagePart()); String body="<img src=/"cid:sdf_email_logo/"/>"


Esto funcionó para mí:

MimeMultipart rootContainer = new MimeMultipart(); rootContainer.setSubType("related"); rootContainer.addBodyPart(alternativeMultiPartWithPlainTextAndHtml); // not in focus here rootContainer.addBodyPart(createInlineImagePart(base64EncodedImageContentByteArray)); ... message.setContent(rootContainer); message.setHeader("MIME-Version", "1.0"); message.setHeader("Content-Type", rootContainer.getContentType()); ... BodyPart createInlineImagePart(byte[] base64EncodedImageContentByteArray) throws MessagingException { InternetHeaders headers = new InternetHeaders(); headers.addHeader("Content-Type", "image/jpeg"); headers.addHeader("Content-Transfer-Encoding", "base64"); MimeBodyPart imagePart = new MimeBodyPart(headers, base64EncodedImageContentByteArray); imagePart.setDisposition(MimeBodyPart.INLINE); imagePart.setContentID("&lt;image&gt;"); imagePart.setFileName("image.jpg"); return imagePart;


Si está utilizando Spring, use MimeMessageHelper para enviar correos electrónicos con contenido en línea ( References ).

Cree el bean JavaMailSender o configúrelo agregando las propiedades correspondientes al archivo application.properties, si está utilizando Spring Boot .

@Bean public JavaMailSender getJavaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost(host); mailSender.setPort(port); mailSender.setUsername(username); mailSender.setPassword(password); Properties props = mailSender.getJavaMailProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", authEnable); props.put("mail.smtp.starttls.enable", starttlsEnable); //props.put("mail.debug", "true"); mailSender.setJavaMailProperties(props); return mailSender; }

Crear algoritmo para generar un ID de contenido único .

import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Random; public class ContentIdGenerator { static int seq = 0; static String hostname; public static void getHostname() { try { hostname = InetAddress.getLocalHost().getCanonicalHostName(); } catch (UnknownHostException e) { // we can''t find our hostname? okay, use something no one else is // likely to use hostname = new Random(System.currentTimeMillis()).nextInt(100000) + ".localhost"; } } /** * Sequence goes from 0 to 100K, then starts up at 0 again. This is large * enough, * and saves * * @return */ public static synchronized int getSeq() { return (seq++) % 100000; } /** * One possible way to generate very-likely-unique content IDs. * * @return A content id that uses the hostname, the current time, and a * sequence number * to avoid collision. */ public static String getContentId() { getHostname(); int c = getSeq(); return c + "." + System.currentTimeMillis() + "@" + hostname; } }

Enviar correo electrónico con inlines.

@Autowired private JavaMailSender javaMailSender; public void sendEmailWithInlineImage() { MimeMessage mimeMessage = null; try { InternetAddress from = new InternetAddress(from, personal); mimeMessage = javaMailSender.createMimeMessage(); mimeMessage.setSubject("Test Inline"); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from); helper.setTo("[email protected]"); String contentId = ContentIdGenerator.getContentId(); String htmlText = "Hello,</br> <p>This is test with email inlines.</p><img src=/"cid:" + contentId + "/" />"; helper.setText(htmlText, true); ClassPathResource classPathResource = new ClassPathResource("static/images/first.png"); helper.addInline(contentId, classPathResource); javaMailSender.send(mimeMessage); } catch (Exception e) { LOGGER.error(e.getMessage()); } }


Utilice el siguiente fragmento de código:

MimeBodyPart imgBodyPart = new MimeBodyPart(); imgBodyPart.attachFile("Image.png"); imgBodyPart.setContentID(''<''+"[email protected]"+''>''); imgBodyPart.setDisposition(MimeBodyPart.INLINE); imgBodyPart.setHeader("Content-Type", "image/png"); multipart.addBodyPart(imgBodyPart);

No necesita una codificación en línea y en la base; puede adjuntar tradicionalmente y agregar el enlace al texto del mensaje principal, que es de tipo text/html .
Sin embargo, recuerde establecer el imgBodyPart de Content-Type del encabezado de imgBodyPart en image/jpg o más justo antes de adjuntarlo al mensaje principal (después de haber adjuntado el archivo).


messageBodyPart.setContent (htmlText, "text / html"); multipart.addBodyPart (messageBodyPart);

messageBodyPart = new MimeBodyPart(); DataSource fds = new FileDataSource("resources/Images/bday.jpg"); messageBodyPart.setDataHandler(new DataHandler(fds)); messageBodyPart.setHeader("Content-ID", "<image>"); // add image to the multipart multipart.addBodyPart(messageBodyPart); msg.setContent(multipart); Transport.send(msg);