2011-02-04 4 views
25

Sto inviando una e-mail e la sto ricevendo correttamente ma la codifica del soggetto non è corretta. Sto inviando "invitación" ma sto ricevendo "invitaci? N". Il contenuto del messaggio è OK.Problema con la codifica dell'oggetto quando si invia una e-mail

Il contenuto del messaggio proviene da una trasformazione di un modello di velocità mentre il soggetto è impostato in una variabile String.

Ho cercato su google e ho visto che alcune persone dicono che MimeUtility.encodeText() potrebbe risolvere il problema, ma non ho avuto successo con esso.

Come posso risolvere il problema? Questo è il codice che ho finora.

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) { 
     ... 
    } 

Grazie

risposta

41

JavaMail ha forse un po 'troppo l'astrazione, e il gioco è vittima di qui. Quando si utilizza

Message msg = new MimeMessage(session); 

sei creando un oggetto MimeMessage ma trattarlo come un oggetto Message. Message ha solo un metodo setSubject(String subject), che utilizza il set di caratteri predefinito della piattaforma per codificare l'oggetto. Se la piattaforma predefinita non può codificarla, si ottengono ? caratteri nell'intestazione risultante. MimeMessage, tuttavia, ha un metodo setSubject(String subject, String charset) che consente di specificare il set di caratteri che si desidera utilizzare per codificare l'oggetto. Quindi basta cambiare il codice in

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

e dovrebbe funzionare.

+0

L'unica sottoclasse spedita di 'Message' è' MimeMessage'. Dubito che qualcuno abbia implementato un'altra sottoclasse. JavaMail sarebbe meno brutto se collassassero semplicemente 'javax.mail' e' javax.mail.internet' - quel livello aggiuntivo di astrazione significa semplicemente che stai costantemente lanciando alla sottoclasse. – dkarp

+0

Questo non ha risolto il mio problema (inviando il simbolo £ nell'oggetto) –

+1

@Mark: hai provato 'msg.setSubject (" \ u00a3 "," UTF-8 ")' e non ha codificato correttamente il soggetto? Cosa c'era nell'intestazione dell'oggetto risultante? – dkarp

4

Forse si può provare: msg.setSubject(subject, "UTF8");

+1

Non esiste questo metodo per javax.mail.Message. Sto usando l'API Java Mail fornita da AppEngine. – Javi

+0

Oh, mi dispiace! Non ho notato che è legato ad AppEngine! – ksimon

+0

All'inizio avevo dimenticato. Ho modificato il post in seguito per taggarlo come AppEngine. Grazie comunque. – Javi

6

si può usare, funziona

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

Nel mio caso l'unica cosa che ha funzionato sta cambiando la lingua del sistema a quello che supporta il set di caratteri desiderato. Prima ho provato molti modi diversi, inclusa la risposta accettata da questo thread, ma nessuno di questi ha aiutato.