tabla - java send html email with images
Cómo enviar un correo electrónico html a Outlook desde Java (8)
Debería ver el origen del mensaje recibido: ¿es el tipo de contenido del mensaje multipart / alternative?
Intento enviar un correo electrónico en formato html utilizando JavaMail pero siempre parece mostrarse solo como un correo electrónico de texto en Outlook.
Aquí está mi código:
try
{
Properties props = System.getProperties();
props.put("mail.smtp.host", mailserver);
props.put("mail.smtp.from", fromEmail);
props.put("mail.smtp.auth", authentication);
props.put("mail.smtp.port", port);
Session session = Session.getDefaultInstance(props, null);
// -- Create a new message --
MimeMessage message = new MimeMessage(session);
// -- Set the FROM and TO fields --
message.setFrom(new InternetAddress(fromEmail, displayName));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
MimeMultipart content = new MimeMultipart();
MimeBodyPart text = new MimeBodyPart();
MimeBodyPart html = new MimeBodyPart();
text.setText(textBody);
text.setHeader("MIME-Version" , "1.0" );
text.setHeader("Content-Type" , text.getContentType() );
html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , html.getContentType() );
content.addBodyPart(text);
content.addBodyPart(html);
message.setContent( content );
message.setHeader("MIME-Version" , "1.0" );
message.setHeader("Content-Type" , content.getContentType() );
message.setHeader("X-Mailer", "My own custom mailer");
// -- Set the subject --
message.setSubject(subject);
// -- Set some other header information --
message.setSentDate(new Date());
// INFO: only SMTP protocol is supported for now...
Transport transport = session.getTransport("smtp");
transport.connect(mailserver, username, password);
message.saveChanges();
// -- Send the message --
transport.sendMessage(message, message.getAllRecipients());
transport.close();
return true;
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
throw e;
}
¿Alguna idea de por qué la versión html del correo electrónico no se mostrará en Outlook?
html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , html.getContentType() );
setContent
y setHeader("Content-Type", String)
hacen lo mismo: ¿es posible que html.getContentType()
devuelva algo que no sea text/html
?
Ampliando en base al comentario y la respuesta de @PhilLho & @ erickson (¡caramba! Debo escribir lentamente), use:
MimeMultipart content = new MimeMultipart("alternative")
Además de eliminar la html.setHeader("Content-Type", html.getContentType())
como sugerencia, reemplazaría la línea:
MimeMultipart content = new MimeMultipart();
…con:
MimeMultipart content = new MimeMultiPart("alternative");
... y eliminando la línea:
message.setHeader("Content-Type" , content.getContentType() );
El constructor predeterminado MimeMultiPart podría estar causando problemas con un tipo de contenido "multiparte / mixto".
Cuando se usa multiparte / alternativa, las alternativas se ordenan según la fidelidad del original, con la mejor reproducción al final. Sin embargo, los clientes suelen dar a los usuarios una opción para mostrar texto sin formato, incluso cuando HTML está presente. ¿Estás seguro de que esta opción no está habilitada en Outlook? ¿Cómo tratan sus mensajes otros agentes de usuarios, como Thunderbird o GMail?
Además, asegúrese de que el HTML esté bien formado. Validaría el contenido HTML con el servicio de validación de W3 y posiblemente lo guardase en un archivo y lo vería con diferentes versiones de IE también. Tal vez hay un error que hace que Outlook recurra al texto sin formato.
Después de mucha investigación, he podido hacer un progreso significativo.
En primer lugar, en lugar de utilizar JavaMail directamente, recomiendo usar la biblioteca de correo electrónico de Jakarta Commons . ¡Esto realmente simplifica mucho el problema!
El código ahora es:
HtmlEmail email = new HtmlEmail();
email.setHostName(mailserver);
email.setAuthentication(username, password);
email.setSmtpPort(port);
email.setFrom(fromEmail);
email.addTo(to);
email.setSubject(subject);
email.setTextMsg(textBody);
email.setHtmlMsg(htmlBody);
email.setDebug(true);
email.send();
Habla de simple.
Sin embargo, todavía hay un problema. La versión html del correo electrónico funciona muy bien en Gmail, Hotmail, etc. Pero todavía no se mostrará correctamente en Outlook. Siempre quiere mostrar la versión de texto y no estoy seguro de por qué. Sospecho que es una configuración en Outlook, pero no puedo encontrarlo ...
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1");
Debería resolver su problema (eliminar /"
caracteres).
Cambiar esto a:
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=/"iso-8859-1/"");
El contenido del conjunto de caracteres debe establecerse, no veo por qué el contenido en sí. Debería ser más bien:
message.setContent(sBuffer.toString(), "text/html;charset=iso-8859-1");
workaroung solution resuelto outlook 2003: Este mensaje utiliza un conjunto de caracteres que no es compatible con el Servicio de Internet. no se visualiza correctamente
Podría deberse a la codificación. La mayoría de las páginas html usan iso-8859-1, no cp-1252 intentan cambiar
Por ejemplo, tu código es:
message.setContent(sBuffer.toString(), "text/html");
Cambiar esto a:
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=/"iso-8859-1/"");
Esto arroja una nueva excepción comprobada: java.io.UnsupportedEncodingException, por lo que necesita declarar que se lanzará o atraparlo. iso-8859-1 es compatible, por lo que la excepción nunca se lanzará a menos que algo se corrompa con su rt.jar.
Saludos, Javeed [email protected]
Use el siguiente código:
mimeBodyPart1.setDataHandler(new DataHandler(new ByteArrayDataSource(messageBody, "text/html; charset=utf-8")));
multiPart.addBodyPart(mimeBodyPart1);
message.setContent(multiPart, "text/html; charset=utf-8");
Ahora, Outlook se muestra en formato html .