2010-08-10 12 views
10

Estoy usando Javamail (javax.mail) para enviar correos. Ajusté correctamente el contenido de mi correo como utf-8. Sin embargo, no pude establecer el asunto como una cadena codificada en utf-8.Javamail cambiando el juego de caracteres de la línea de asunto

me trataron incluso

mail.setSubject(new String(subject.getBytes("utf-8"), "utf-8")); 

en sujetos sin embargo, todavía envía como Cp1252. Ejemplo de encabezados de correo se dan a continuación:

¿Alguna idea?

example from mail headers http://m.friendfeed-media.com/a328a80db12f3c17a8aed06be106045354355abf

Respuesta

24

Debe usar setSubject(String subject, String charset) que es una función conveniente para este propósito.

Session session=Session.getDefaultInstance(new Properties()); 
MimeMessage mimeMsg= new MimeMessage(session); 
String subject="Herr Müller reist nach \u0141\u00f3d\u017a."; 
mimeMsg.setSubject(subject,"utf-8"); 
System.out.println(subject); 
System.out.println(mimeMsg.getHeader("Subject")[0]); 

En MimeUtility se dice:

Hay un conjunto de métodos para codificar y decodificar las cabeceras MIME según RFC 2047. Nótese que, en general, estos métodos no son necesarios cuando se utilizan métodos como setSubject y setRecipients; JavaMail codificará y decodificará datos automáticamente al usar estos métodos de "nivel superior". Los métodos a continuación solo son necesarios para maniuplar encabezados MIME en bruto utilizando los métodos setHeader y getHeader.

Desde mi punto de vista, Message.setSubject debe ser el punto de entrada para este fin.

Aparece el cp1252 en la codificación del asunto, porque es la codificación estándar en su plataforma.

Su ejemplo publicado es el "resultado" de

mail.setSubject(MimeUtility.encodeText(subject, "cp1252", "Q"));` 
+0

Mi MimeMessage no tiene setSubject (String, String) interesante. Tal vez estoy usando una versión anterior de Javamail. gracias de cualquier manera. –

+0

Debe ser un javamail muy antiguo, porque incluso [MimeMessage en la Versión 1.1] [1] del año 1999 lo tiene. ;-) [1]: https://www.cs.auckland.ac.nz/references/java/javamail/javax/mail/internet/MimeMessage.html –

+3

El mensaje no contiene setSubject (String, String) mientras que MimeMessage lo hace. –

19

resuelto.

mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B")); 

lo resuelve y envía temas de correo codificados utf-8. \ N/

los valores legales para "codificación" son "Q" y "B" ... La codificación "Q" se recomienda para su uso cuando la mayoría de los caracteres a codificar están en el ASCII conjunto de caracteres; de lo contrario, se debe usar la codificación "B".

Ver http://tools.ietf.org/html/rfc2047.

+0

gracias por publicar la solución –

2

Problema resuelto!

mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B")); 

lo resuelve y envía temas de correo codificados utf-8.

¿Por qué hay esa "B" por la que no hay ISO-algo?

+1

La 'B' significa Base64. http://tools.ietf.org/html/rfc2047#section-4 –

0

Me encontré con un problema similar con Apache Camel Mail, que utiliza Java Mail. Configuración

exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");

antes de encaminar a SMTP, resuelto el problema.

Cuestiones relacionadas