mkyong - spring javamail tutorial
¿Cómo configurar MimeBodyPart ContentType en "text/html"? (7)
¿Qué hay de usar:
mime_body_part.setHeader("Content-Type", "text/html");
En la documentación de getContentType dice que el valor devuelto se encuentra utilizando getHeader (nombre). Entonces, si configuras el encabezado usando setHeader, creo que todo debería estar bien.
El siguiente programa muestra un valor de retorno inesperado para el tipo de mime multiparte HTML. ¿Por qué este programa imprime "text / plain" y no "text / html"?
public class Main {
public static void main(String[] args) throws javax.mail.MessagingException, java.io.IOException {
javax.mail.internet.MimeBodyPart mime_body_part = new javax.mail.internet.MimeBodyPart();
mime_body_part.setContent("<h1>foo</h1>", "text/html");
System.out.println(mime_body_part.getContentType());
}
}
He intentado varias formas alternativas, incluida la configuración de un ByteArrayDataSource envuelto en un DataHandler, pero sin éxito. Lo mismo sucede cuando intento esto con un MimeMessage en lugar de un MimeBodyPart.
Para compilar y ejecutar en Linux:
javac -classpath .:activation.jar:mail.jar Main.java
java -classpath .:activation.jar:mail.jar Main
Hay un método setText()
que toma 3 argumentos:
public void setText(String text, String charset, String subtype)
throws MessagingException
Parámetros:
text - the text content to set
charset - the charset to use for the text
subtype - the MIME subtype to use (e.g., "html")
NOTA: el subtipo toma el texto después de / en los tipos MIME así que por ej.
- texto / html sería html
- text / css sería css
- y así..
Llame a MimeMessage.saveChanges()
en el mensaje adjunto, que actualizará los encabezados en cascada a través de la estructura MIME en una llamada a MimeBodyPart.updateHeaders()
en su parte del cuerpo. Es esta llamada de updateHeaders
que transfiere el tipo de contenido del DataHandler
al encabezado de Content-Type
MIME de la parte.
Cuando configura el contenido de un MimeBodyPart
, JavaMail crea internamente (y no obviamente) un objeto DataHandler
que envuelve el objeto que se pasa. El encabezado Content-Type
no se actualiza inmediatamente.
No hay una forma sencilla de hacerlo en su programa de prueba, ya que no tiene un MimeMessage
y MimeBodyPart.updateHeaders()
que no lo contenga no es public
.
Aquí hay un ejemplo de trabajo que ilumina resultados esperados e inesperados:
public class MailTest {
public static void main( String[] args ) throws Exception {
Session mailSession = Session.getInstance( new Properties() );
Transport transport = mailSession.getTransport();
String text = "Hello, World";
String html = "<h1>" + text + "</h1>";
MimeMessage message = new MimeMessage( mailSession );
Multipart multipart = new MimeMultipart( "alternative" );
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText( text, "utf-8" );
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent( html, "text/html; charset=utf-8" );
multipart.addBodyPart( textPart );
multipart.addBodyPart( htmlPart );
message.setContent( multipart );
// Unexpected output.
System.out.println( "HTML = text/html : " + htmlPart.isMimeType( "text/html" ) );
System.out.println( "HTML Content Type: " + htmlPart.getContentType() );
// Required magic (violates principle of least astonishment).
message.saveChanges();
// Output now correct.
System.out.println( "TEXT = text/plain: " + textPart.isMimeType( "text/plain" ) );
System.out.println( "HTML = text/html : " + htmlPart.isMimeType( "text/html" ) );
System.out.println( "HTML Content Type: " + htmlPart.getContentType() );
System.out.println( "HTML Data Handler: " + htmlPart.getDataHandler().getContentType() );
}
}
No sé por qué (el método no está documentado), pero al mirar el código fuente, esta línea debería hacerlo:
mime_body_part.setHeader("Content-Type", "text/html");
Para mí, configuré dos veces:
(MimeBodyPart)messageBodyPart.setContent(content, text/html)
(Multipart)multipart.addBodyPart(messageBodyPart)
(MimeMessage)msg.setContent(multipart, text/html)
y ha estado funcionando bien.
Prueba con esto:
msg.setContent(email.getBody(), "text/html; charset=ISO-8859-1");
Utilizando "<h1>STRING<h1>".getBytes();
puedes crear un ByteArrayDataSource
con tipo de contenido y establecer setDataHandler
en tu MimeBodyPart
tratar:
String html "Test JavaMail API example. <br><br> Regards, <br>Ivonei Jr"
byte[] bytes = html.getBytes();
DataSource dataSourceHtml= new ByteArrayDataSource(bytes, "text/html");
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDataHandler(new DataHandler(dataSourceHtml));
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(bodyPart);