web-dev-qa-db-ja.com

件名の文字セットを変更するJavamail

Javamail(javax.mail)を使用してメールを送信しています。メールの内容をutf-8として正常に調整しました。ただし、件名をutf-8でエンコードされた文字列として設定できませんでした。

私も試しました

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

ただし、件名については、Cp1252として送信されます。メールのヘッダーの例を以下に示します。

何か案は?

メールヘッダーの例http://m.friendfeed-media.com/a328a80db12f3c17a8aed06be106045354355abf

12
AhmetB - Google

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

解決しました。

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

それを解決し、utf-8でエンコードされたメールの件名を送信します。\n /

「encoding」の有効な値は「Q」と「B」です...「Q」エンコーディングは、エンコードされる文字のほとんどがASCII文字セットにある場合に使用することをお勧めします;それ以外の場合は、「B」エンコーディングを使用する必要があります。

http://tools.ietf.org/html/rfc2047 を参照してください。

23
AhmetB - Google

問題が解決しました!

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

それを解決し、utf-8でエンコードされたメールの件名を送信します。

なぜその「B」があるのか​​、なぜISOがないのか?

2
Sami

JavaMail。Settingを使用するApacheCamel Mailで、同様の問題が発生しました。

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

sMTPにルーティングする前に、問題を解決しました。

0
user2200192

MimeMessage.setSubject(String subject、String charset) メソッドは問題を解決します:mimeMsg.setSubject(subject、 "utf-8");

これは更新されたリンクです。 OracleがSunを購入した後、以前のドキュメントリンクはOracleによって却下されました。

0
Mna