2011-02-04 126 views
25

我發送了一封電子郵件,但收到的郵件正確,但主題的編碼不正確。我發送「invitación」,但我收到「invitaci?n」。消息的內容是確定的。發送郵件時發生主題編碼問題

消息的內容來自速度模板的轉換,而主題被設置爲字符串變量。

我用google搜索了一下,我看到有些人說MimeUtility.encodeText()可以解決這個問題,但我沒有成功。

我該如何解決問題?這是迄今爲止的代碼。

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

感謝

回答

41

JavaMail中有可能是有點過分抽象和你在這裏的犧牲品了。當您使用

Message msg = new MimeMessage(session); 

創建一個MimeMessage對象,而是把它當作一個Message對象。 Message只有一個setSubject(String subject)方法,它使用平臺默認字符集來編碼主題。如果平臺默認不能對其進行編碼,則會在結果標題中獲得?個字符。然而,MimeMessage有一個setSubject(String subject, String charset)方法,它可以讓你指定你想用來編碼主題的字符集。所以只需將您的代碼切換到

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

它應該工作。

4

也許你可以試試:msg.setSubject(subject, "UTF8");

+1

javax.mail.Message沒有這種方法。我正在使用AppEngine提供的Java Mail API。 – Javi 2011-02-04 12:32:23

+0

哦,對不起!我沒有注意到這與AppEngine有關! – ksimon 2011-02-04 12:36:49

6

就可以使用,它的工作原理

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

在我的情況下,只有其中的工作正在改變系統區域設置到支持所需的字符集的一個東西。 在此之前,我嘗試了很多不同的方式,包括從這個線程接受的答案,但沒有一個幫助。