2011-02-04 12 views
25

電子メールを送信していますが、正しく受信しましたが、件名のエンコードが正しくありません。私は "invitación"を送りますが、私は "invitaci?n"を受け取ります。メッセージの内容はOKです。電子メールを送信するときの件名エンコードの問題

メッセージの内容は、対象が文字列変数に設定されている間にVelocityテンプレートの変換から来ています。

私はグーグルで調べましたが、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"); 

に切り替えるだけです。

使用できる
+0

'Message'の唯一のサブクラスは' MimeMessage'です。誰かが別のサブクラスを実装しているかどうかは疑問だ。 JavaMailは、javax.mailとjavax.mail.internetを崩壊させただけではあまり意味がありません。抽象レイヤーが追加されているということは、常にサブクラスにキャストしていることを意味します。 – dkarp

+0

これは私の問題を解決しませんでした(件名に£記号を送信) –

+1

@マーク: 'msg.setSubject(" \ u00a3 "、" UTF-8 ")'を試しました。結果のSubjectヘッダーには何が入っていましたか? – dkarp

4

たぶん、あなたは試すことができます:msg.setSubject(subject, "UTF8");

+1

このメソッドはjavax.mail.Messageではありません。 AppEngineが提供するJava Mail APIを使用しています。 – Javi

+0

ああ、申し訳ありません!私はそれがAppEngineに関連していることに気付かなかった! – ksimon

+0

私は最初は忘れていた。私はあとでこの記事を編集してAppEngineとしてタグ付けしました。とにかくありがとう。 – Javi

6

は、それが動作します

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

私の場合で働いていた唯一のことは、所望の文字セットをサポートしているものにシステムロケールを変更しています。 その前に私はこのスレッドから受け入れられた答えを含む多くの異なる方法を試しましたが、どれも役に立たなかった。

関連する問題