- - PR -
JavaMail 文字化け Body → ○, Subject → ×
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-02-28 02:42
JavaMailの文字化けに関する質問です。
Body部分は文字化けされず、Subjectの部分が文字化けしてしまいます。 以前の投稿にてよく文字化けに関することが記載されていたため、それを参考に いろいろ試してみましたがうまくいきません。 以下は実装したソースの一部を抜粋したものです。 ----- MimeMessage objMsg=new MimeMessage(session); : objMsg.setSubject("メールテスト","ISO-2022-JP"); objMsg.setHeader("Content-Transfer-Encoding", "7bit"); objMsg.setHeader("Content-Type", "text/plain; charset=iso-2022-jp"); : ----- SubjectにISO-2022-JPを指定、及び、Headerに"Content-Transfer-Encoding"や、 "Content-Type"を指定しても文字化けしてしまいます。 ちなみに受信した件名は、以下ような文字列になってしまいます。 "メールテスト" → "[eXg" 以下ようなプログラムにてメールを送信しているのですが、何か実装方法が 間違っているのでしょうか? ------ 以下、実装したプログラム ------ public class MailTest { public static void main(String[] args) { Properties objPrp=new Properties(); objPrp.put("mail.smtp.host","smtp.nifty.com"); // SMTPサーバ名 objPrp.put("mail.host","smtp.nifty.com"); // 接続するホスト名 objPrp.put("mail.smtp.auth", "true"); // POP Before SMTP 対象 // メールセッションを確立 Session session=Session.getDefaultInstance(objPrp,null); // 送信メッセージを生成 MimeMessage objMsg=new MimeMessage(session); try { // 送信先(TOのほか、CCやBCCも設定可能) objMsg.setRecipients(Message.RecipientType.TO,"aaaaaaaaa@nifty.com"); // Fromヘッダ InternetAddress objFrm=new InternetAddress("YYYYYYYY@nifty.com","Y.Yamada"); objMsg.setFrom(objFrm); // 件名 objMsg.setSubject("メールテスト","ISO-2022-JP"); // 本文 objMsg.setText("こんにちは","ISO-2022-JP"); objMsg.setHeader("Content-Type", "text/plain; charset=iso-2022-jp"); objMsg.setHeader("Content-Transfer-Encoding", "7bit"); // メール送信 Transport transport = session.getTransport("smtp"); transport.connect( "smtp.nifty.com", "xxxxxxxx", // userid "yyyyyyyy" // password ); transport.sendMessage(objMsg, objMsg.getAllRecipients()); transport.close(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } } } | ||||||||
|
投稿日時: 2006-02-28 10:28
mimeMessage.setSubject( MimeUtility.encodeText( "件名だ!!", "ISO-2022-JP", "B");
MimeUtility.encodeText()でググればいいことがあるかも B:日本語とか Q:ASCIIのみの場合 | ||||||||
|
投稿日時: 2006-02-28 10:39
この掲示板にもいくらでも情報がありますが。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27772&forum=12 しかし、bodyがそのまま通ってるというのが解せない。 Outlookがよけいなことしてるとか、クライアントの自動判別に過ぎないとか、 そういうことないですか? | ||||||||
|
投稿日時: 2006-02-28 14:59
> この掲示板にもいくらでも情報がありますが。
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27772&forum=12 はい、すでにそちらも参照しMimeUtilityの方法も試しております。 私の書き方が悪かったです。申し訳ありません。 > objMsg.setSubject("メールテスト","ISO-2022-JP"); ↓ >mimeMessage.setSubject( MimeUtility.encodeText( "件名だ!!", "ISO-2022-JP", "B"); 念のため上記も変更してMimeUtility.encodeTextにしてみたのですが、やはりうまくいきませんでした。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=26756&forum=12 上記掲示板では、以下のような記載が正しいとあるため試したしだいです。 ------- msg.setText(message,"ISO-2022-JP"); msg.setHeader("Content-Transfer-Encoding", "7bit"); ------- ちなみに、session.setDebug(true);を入れログ(自分の場合は Eclipse コンソール)を参照すると、文字化けしているsubject は正常に表示され、bodyの部分は文字化けしてでているようです。 ------- subject:件名だ!! content-type:text/plain; charset=iso-2022-jp content-transfer-encoding:7bit $B$3$s$K$A$O . 250 2.5.0 Ok. ------- > Outlookがよけいなことしてるとか、クライアントの自動判別に過ぎないとか、 > そういうことないですか? ちなみに、メールクライアントは、秀丸メール、Outlookで試してみました。 クライアントの自動判別も考慮に入れ調べてみたいと思います。 | ||||||||
|
投稿日時: 2006-02-28 15:28
Content-Typeの設定をしてないからだと思います。
この場合の設定というのは、Headerに対してのものではなく、 SubjectとTextのそれぞれに対するものです。 http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/mail/internet/MimeMessage.html#setSubject(java.lang.String,%20java.lang.String) http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/javax/mail/internet/MimeMessage.html#setText(java.lang.String,%20java.lang.String) テキストを設定するときに、あわせてcharsetも放り込んでみてください。 テキストはもちろんエンコード済みのものを。 | ||||||||
|
投稿日時: 2006-02-28 22:52
この化け方から判断すると、subjectをShift_JISでエンコードして送信しています。
これも明らかに変です。 bodyは、「こんにちは」という文字列が正しくISO-2022-JPでエンコードされていますが、 subjectの方は、プラットホームのデフォールトエンコーディングのままになっています。 見た目とは逆に、正常なのは本文の方で、化けているのはsubjectの方です。 提示されているソースコードから推測される挙動と一致しないので、 ソースとclassファイルの対応がちゃんと取れているか (修正前のclassファイルを実行してないか) 確認してみましょう。 文字化けに関しては、「読める」「読めない」ではなくて、 「期待されるエンコード」と「実際に送信されるエンコード」から判断しないと、 何をしているか判らなくなってしまいます。 | ||||||||
|
投稿日時: 2006-02-28 22:56
何度も質問して申し訳ありません。
> この場合の設定というのは、Headerに対してのものではなく、 > SubjectとTextのそれぞれに対するものです。 ですが、以下のような指定の仕方でしょうか? ※Subjectのみ現状文字化けしているため、setSubjectを記載しております。 objMsg.setSubject( MimeUtility.encodeText( "メールテスト", "ISO-2022-JP", "B"), "text/plain; charset=iso-2022-jp" ); 上記指定の方法が正しいかわかりませんが、変わらず "メールテスト" → "[eXg" を件名に表示してしまいます。 ちなみに、"text/plain; charset=iso-2022-jp" を "iso-2022-jp"にしても同様でした。 MimeUtility.encodeTextの出力内容を確かめるべく、以下systemoutにて出力した結果も、"メールテスト"でした。 ----- String subject = MimeUtility.encodeText( "メールテスト", "ISO-2022-JP", "B"); System.out.println("subject = " + subject) ----- 受け取ったメールのプロパティは以下のようなものです。 ---------- YYYYYYYY@nifty.com To: aaaaaaaaa@nifty.com Subject: [eXg Date: Tue, 28 Feb 2006 22:44:58 +0900 Return-Path: YYYYYYYY@nifty.com Received: by mbox55.nifty.com id 440453df172515; Tue, 28 Feb 2006 22:45:03 +0900 Received: from UUUUUU (TTTTTT.adsl.ppp.infoweb.ne.jp [ZZZ.ZZZ.ZZZ.ZZZ]) (authenticated) by aaaaaa.nifty.com with ESMTP id aaaaaaaa for <aaaaaaaaa@nifty.com>; Tue, 28 Feb 2006 22:44:58 +0900 Authentication-Results: userg504.nifty.com from=YYYYYYYY@nifty.com; sender-id=neutral; spf=neutral DomainKey-Signature: a=rsa-sha1; s=userg504; d=nifty.com; c=simple; q=dns; b=k+zsm9bAb4/0RQfBaL8c+D47Fig2pKBy/EYP8pbiE2s+B9E2/8TGIejSiKO5o82B8 +OEgPvbUppskwQaJWGusw== Message-Id: <200602281344.k1SDivfP014809@userg504.nifty.com> content-type: text/plain; charset=iso-2022-jp content-transfer-encoding: 7bit Status: U X-UIDL: 1141134303.5925.mailbox こんにちは ---------- | ||||||||
|
投稿日時: 2006-02-28 23:13
すみません、行き違いでコメントしていました。
確かめてみます。 |