2011-02-04 14 views
25

Wysyłam wiadomość e-mail i otrzymuję ją poprawnie, ale kodowanie tematu jest nieprawidłowe. Wysyłam "invitación", ale otrzymuję "invitaci? N". Treść wiadomości jest OK.Problem z kodowaniem tematu podczas wysyłania wiadomości e-mail

Treść wiadomości pochodzi z transformacji szablonu prędkości, gdy temat jest ustawiony w zmiennej String.

Mam googleed wokół i widziałem, że niektórzy ludzie mówią, że MimeUtility.encodeText() może rozwiązać problem, ale nie miałem z nim żadnego sukcesu.

Jak mogę rozwiązać problem? To jest kod, który do tej pory miałem.

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

Dzięki

Odpowiedz

41

JavaMail ma chyba trochę za dużo abstrakcji, i jesteś ofiarą tutaj. Podczas korzystania

Message msg = new MimeMessage(session); 

jesteś tworzeniaMimeMessage obiektu, ale traktując ją jako Message obiektu. Message ma tylko metodę setSubject(String subject), która używa domyślnego zestawu znaków platformy do kodowania tematu. Jeśli domyślna platforma nie może go zakodować, otrzymasz znaki ? w wynikowym nagłówku. MimeMessage ma jednak metodę setSubject(String subject, String charset), która pozwoli ci określić zestaw znaków, który chcesz użyć do zakodowania tematu. Po prostu zamień swój kod na

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

i powinien działać.

+0

Jedyną dostarczoną podklasą 'Message' jest' MimeMessage'. Wątpię, czy ktoś zaimplementował inną podklasę. JavaMail byłby mniej groteskowy, gdyby właśnie zwinął 'javax.mail' i' javax.mail.internet' - ta dodatkowa warstwa abstrakcji oznacza, że ​​ciągle rzucasz się na podklasę. – dkarp

+0

To nie rozwiązało mojego problemu (wysłanie symbolu GBP w temacie). –

+1

@ Mark: Próbowałeś 'msg.setSubject (" \ u00a3 "," UTF-8 ")' i nie zakodowałeś tematu prawidłowo? Co znajdowało się w wynikowym nagłówku tematu? – dkarp

4

Być może można spróbować: msg.setSubject(subject, "UTF8");

+1

Nie ma tej metody dla javax.mail.Message. Używam Java Mail API dostarczonego przez AppEngine. – Javi

+0

Och, przepraszam! Nie zauważyłem, że jest to związane z AppEngine! – ksimon

+0

Z początku zapomniałem. Edytowałem post później, aby oznaczyć go jako AppEngine. Dzięki i tak. – Javi

6

można użyć, to działa

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

W moim przypadku jedyną rzeczą, która pracowała zmienia ustawienia regionalne systemu, aby ten, który obsługuje żądanego zestawu znaków. Zanim to zrobiłem, próbowałem na wiele różnych sposobów, łącznie z zaakceptowaną odpowiedzią z tego wątku, ale żadna z nich nie pomogła.

Powiązane problemy