2008-11-26 23 views
18

Estoy tratando de enviar un correo electrónico en formato html usando JavaMail pero siempre parece mostrarse solo como un correo electrónico de texto en Outlook.Cómo enviar un correo electrónico html a outlook desde Java

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

Cualquier idea por qué la versión html del correo electrónico no será mostrar en Outlook?

+0

Actualicé mi respuesta con una nueva idea. – erickson

+0

@erickson: la respuesta a votaciones es tuya;) –

Respuesta

16

Después de mucha investigación, he podido hacer un progreso significativo.

En primer lugar, en lugar de usar JavaMail directamente, recomiendo usar la biblioteca Jakarta Commons Email. ¡Esto realmente simplifica mucho el problema!

El código es ahora:

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

Hablar 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 ...

3
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() está volviendo algo más que text/html?

expansor a base de comentarios y @PhilLho & @ respuesta de Erickson (vaya, debo escribir lentamente), utilice:

MimeMultipart content = new MimeMultipart("alternative") 
+0

Ese es, de hecho, un problema. Se está devolviendo "text/plain". Así que hice el ajuste, pero sigo teniendo el mismo problema ... ¡Buena captura! –

1

usted debe buscar en la fuente del mensaje recibido: es el tipo de contenido de el mensaje multipart/alternative?

5

Además de eliminar el html.setHeader("Content-Type", html.getContentType()) llamada como ya sugiere, me reemplace la línea:

MimeMultipart content = new MimeMultipart(); 

y hellip; con:

MimeMultipart content = new MimeMultiPart("alternative"); 

y hellip; y la eliminación de la línea:

message.setHeader("Content-Type" , content.getContentType()); 

El constructor MimeMultiPart predeterminado podría ser causa ng problemas con un tipo de contenido "multiparte/mixto".

Al usar multipart/alternative, las alternativas se ordenan por su fidelidad con respecto al 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. Validaba el contenido HTML con el W3 validation service y posiblemente lo guardaba en un archivo y lo veía con diferentes versiones de IE también. Tal vez hay un error que hace que Outlook recurra al texto sin formato.

+0

Lo he intentado también sin suerte. También probé los otros modos, aunque sabía que no funcionarían (mezclados, etc.). Para Outlook, solo desea mostrar la versión de texto, nunca el cuerpo html. Y gmail muestra el html, pero html como texto, no como una página renderizada html. Extraño... –

0

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 utilizan iso-8859-1 no cp-1252 trate de cambiar

Por ejemplo, el 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]

3

cambiar esto a:

message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\""); 

El contenido de juego de caracteres es necesario establecer, no veo por qué el contenido en sí. debería ser más bien:

message.setContent(sBuffer.toString(), "text/html;charset=iso-8859-1"); 
1
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1"); 

debería resolver su problema (eliminado \" caracteres).

2

He utilizado 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, de Outlook muestra en html formato.

Cuestiones relacionadas