2011-02-04 19 views
25

Estoy enviando un correo electrónico y lo estoy recibiendo correctamente, pero la codificación del tema no es correcta. Estoy enviando "invitación" pero estoy recibiendo "invitación". El contenido del mensaje está bien.Problema con la codificación del asunto al enviar un correo electrónico

El contenido del mensaje proviene de una transformación de una Plantilla de velocidad mientras el sujeto está establecido en una variable de cadena.

He buscado en Google y he visto que algunas personas dicen que MimeUtility.encodeText() podría resolver el problema, pero no he tenido éxito.

¿Cómo puedo resolver el problema? Este es el código que tengo hasta ahora.

String subject = "Invitación"; 
String msgBody = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/vmTemplates/template.vm", "UTF-8", model); 

Properties props = new Properties(); 
Session session = Session.getDefaultInstance(props, null); 

try { 
    String encodingOptions = "text/html; charset=UTF-8"; 
    Message msg = new MimeMessage(session); 
    msg.setHeader("Content-Type", encodingOptions); 
    msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom)); 
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo)); 

    msg.setSubject(subject); 
    msg.setContent(msgBody, encodingOptions); 
    Transport.send(msg); 

    } catch (AddressException e) { 
     ... 
    } catch (MessagingException e) { 
     ... 
    } 

Gracias

Respuesta

41

JavaMail tiene quizás un poco demasiado abstracción, y que está cayendo víctima de aquí. Cuando se utiliza

Message msg = new MimeMessage(session); 

estás crear un objeto MimeMessage pero tratándolo como un objeto Message. Message tiene solo un método setSubject(String subject), que usa el juego de caracteres predeterminado de la plataforma para codificar el sujeto. Si la plataforma predeterminada no puede codificarlo, obtendrá ? caracteres en el encabezado resultante. MimeMessage, sin embargo, tiene un método setSubject(String subject, String charset) que le permitirá especificar el juego de caracteres que desea utilizar para codificar el tema. Por lo que sólo cambiar su código para

MimeMessage msg = new MimeMessage(session); 
msg.setHeader("Content-Type", encodingOptions); 
msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom)); 
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo)); 

msg.setSubject(subject, "UTF-8"); 

y debería funcionar.

+0

La única subclase enviada de 'Mensaje' es' MimeMessage'. Dudo que alguien haya implementado otra subclase. JavaMail sería menos desagradable si colapsaran 'javax.mail' y' javax.mail.internet' - esa capa adicional de abstracción solo significa que estás constantemente transfiriendo a la subclase. – dkarp

+0

Esto no resolvió mi problema (enviando el símbolo £ en el asunto) –

+1

@Mark: ¿Intentó 'msg.setSubject (" \ u00a3 "," UTF-8 ")' y no codificó el tema correctamente? ¿Qué había en el encabezado Asunto resultante? – dkarp

4

Tal vez usted puede intentar: msg.setSubject(subject, "UTF8");

+1

No existe este método para javax.mail.Message. Estoy usando API de Java Mail proporcionada por AppEngine. – Javi

+0

¡Oh, lo siento! ¡No me di cuenta de que está relacionado con App Engine! – ksimon

+0

Lo había olvidado al principio. Edité la publicación más tarde para etiquetarla como AppEngine. Gracias de cualquier manera. – Javi

6

puede utilizar, funciona

msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q")); 
0

En mi caso lo único que funcionó está cambiando la configuración regional del sistema a la que desea que soporta el conjunto de caracteres. Antes de eso probé de muchas maneras diferentes, incluida la respuesta aceptada de este hilo, pero ninguna de ellas me ayudó.

Cuestiones relacionadas