2010-08-10 71 views
10

我正在使用Javamail(javax.mail)發送郵件。我成功地將我的郵件內容調整爲utf-8。但是我無法將主題行設置爲utf-8編碼的字符串。Javamail更改字符集主題行

我想即使

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

上受到然而它仍然作爲發送的Cp1252。郵件示例標題如下:

任何想法?

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

回答

24

您應該使用setSubject(String subject, String charset)這是一個方便的功能用於此目的。

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

MimeUtility據說:

有一組方法來編碼和根據RFC 2047。注意,在一般情況下,不使用方法時需要這些方法解碼MIME頭如setSubject和setRecipients;當使用這些「更高級別」的方法時,JavaMail將自動編碼和解碼數據。以下方法僅在使用setHeader和getHeader方法制作原始MIME頭時需要。

從我的角度來看,Message.setSubject應該是此目的的切入點。

您的主題編碼中的cp1252顯示出來,因爲它是您平臺上的標準編碼。

您發佈的例子是

的 「結果」
mail.setSubject(MimeUtility.encodeText(subject, "cp1252", "Q"));` 
+0

我的MimeMessage沒有setSubject(String,String)有趣。也許我正在使用舊版本的Javamail。不管怎麼說,還是要謝謝你。 – 2010-08-11 09:58:00

+0

這肯定是一個非常古老的javamail,因爲即使在1999年的[MimeMessage in Version 1.1] [1]中也有它。 ;-) [1]:https://www.cs.auckland.ac.nz/references/java/javamail/javax/mail/internet/MimeMessage.html – 2010-08-11 18:00:14

+3

消息不包含setSubject(String,String)而MimeMessage的確如此。 – 2014-03-05 17:13:30

19

已解決。

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

解決它併發送utf-8編碼的郵件主題。 \ N/

爲「編碼」合法的值是「Q」和「B」 ...的「Q」編碼 推薦使用時最要被編碼的字符是在 的ASCII字符集;否則,應該使用「B」編碼。

參見http://tools.ietf.org/html/rfc2047

+0

感謝發佈解決方案 – 2010-08-10 16:42:42

2

問題解決了!

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

解決它併發送utf-8編碼的郵件主題。

爲什麼有「B」爲什麼沒有ISO的東西?

+1

'B'代表Base64。 http://tools.ietf.org/html/rfc2047#section-4 – 2013-03-27 14:46:42

0

我遇到了使用Java Mail的Apache Camel Mail的類似問題。路由到SMTP之前設定

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

,解決了這個問題。