web-dev-qa-db-ja.com

メール送信時の件名のエンコードに関する問題

メールを送信していて、正しく受信していますが、件名のエンコードが正しくありません。 「invitación」を送信していますが、「invitaci?n」を受信して​​います。メッセージの内容は問題ありません。

メッセージの内容は、件名が文字列変数に設定されている間、速度テンプレートの変換からのものです。

私はググってみましたが、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) {
        ...
    } 

ありがとう

28
Javi

JavaMailの抽象化は多すぎるかもしれませんが、ここではJavaMailの犠牲になっています。使うとき

_Message msg = new MimeMessage(session);
_

あなたはcreatingMimeMessageオブジェクトですが、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");
_

そしてそれはうまくいくはずです。

43
dkarp

使用できます

msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));
7
Edy Aguirre

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

4
ksimon

私の場合、機能したのは、システムロケールを目的の文字セットをサポートするロケールに変更することだけです。その前に、このスレッドから受け入れられた回答を含むさまざまな方法を試しましたが、どれも役に立ちませんでした。

0
Alexey