- - PR -
メールの文字が化ける
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-15 14:55
MimeMessageを使用して、メールの送信を試みようとしています。が、
Subject、本文がすべて化けてしまいます。 このページを何度もみていろいろと確かめてみたのですが、すべて化けてしまいます。 送信先が携帯端末(Docomo)のためか?と思いPCのOutlookにも送ってみましたが それもだめでした。 ソースは // MIMEメッセージを作成 MimeMessage msg = new MimeMessage(session); // 送信元アドレスをセット msg.setFrom(new InternetAddress("xxxxxxxx", "iso-2022-jp")); // 宛先をセット msg.setRecipients(Message.RecipientType.TO, "xxxxxxxx.xx.xx") ; //件名 msg.setSubject("ほげほげ", "iso-2022-jp" ); //本文 msg.setText("ほげほげボディ", "iso-2022-jp"); //本文 の設定 // msg.setText(body, "iso-2022-jp"); // メールの形式を指定 msg.setHeader("Content-Transfer-Encoding", "7bit"); msg.setHeader("Content-Type", "text/plain; charset=\"iso-2022-jp\""); です。 Subjectのところ String encordedstr = MimeUtility.encodeText("ほげほげ", "iso-2022-jp", "B"); msg.setSubject(encordedstr, "iso-2022-jp" ); でもだめでした。 Textのところ String encodedBody = MimeUtility.encodeText("ほげほげボディ", "iso-2022-jp", "B"); msg.setContent(encodedBody, "text/plain; charset=iso-2022-jp"); msg.setText(body); でもだめでした。 ほげほげの化け方は 、ロ、イ、ロ、イ です。 setTextのところ msg.setText("ほげほげボディ", "Shift_JIS"); でおこなうと化けなかった文字があったり化けたもじが混じっていたりでした。 MimeBodyPartなども使ってみたのですが・・・これも化けてしまいました。 情報をください。よろしくおねがいします。 | ||||||||||||||||
|
投稿日時: 2006-04-15 15:59
色々と問題はありますが・・・
(1) new InternetAddress()の第2引数はencoding名ではありません。 3引数のコンストラクタを使いましょう。 (2) 本文は、改行コードで終わる必要があります。 最後に改行がついていないと、正しくエンコードされません。 (3) msg.setText() した場合、setHeader("Content-Type", ...) は不要です。 setTextの引数と一致していれば書いても害はありませんが、 食い違っていると不具合の原因になるので、書かない方が良いと思います。 本文が文字化けするとしたら、(2)が原因でしょう。 Subjectが文字化けする理由はないように見受けられます。 msg.writeTo(new FileOutputStream("mail.log")); みたいな感じで、実際にどんな出力になっているか確認して見るのが良いかと。 | ||||||||||||||||
|
投稿日時: 2006-04-17 11:24
>(1) new InternetAddress()の第2引数はencoding名ではありません。
> 3引数のコンストラクタを使いましょう。 ご指摘ありがとうございます。修正しました。 >(2) 本文は、改行コードで終わる必要があります。 > 最後に改行がついていないと、正しくエンコードされません。 >(3) msg.setText() した場合、setHeader("Content-Type", ...) は不要です。 > setTextの引数と一致していれば書いても害はありませんが、 > 食い違っていると不具合の原因になるので、書かない方が良いと思います。 了解しました。 > >本文が文字化けするとしたら、(2)が原因でしょう。 >Subjectが文字化けする理由はないように見受けられます。 本文の最後に"\r\n"を追加しました。 //本文 の設定 String body = "xxxxxxxxxxxxxxxxxxxx" + "\r\n"; msg.setText(body, "iso-2022-jp"); 件名はそのままです。 msg.setSubject(MAILINFO_SUBJECT, "iso-2022-jp"); Content-Typeはコメントにし、setHeaderには msg.setHeader("Content-Transfer-Encoding", "7bit"); のみ設定しています。 //msg.setHeader("Content-Type", "text/plain; charset=\"iso-2022-jp\""); 以上の修正を加え、Tryしてみたところ文字化けは改修されませんでした。 >msg.writeTo(new FileOutputStream("mail.log")); logの中身は、 Subject: =?iso-2022-jp?B?xxxxxxxxxxxxxxxxxx=?= Mime-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit xxxxxxxxxxxxxxx こんな感じなのです。。。 Subjectのxxxxxxxxxxxは英数字の羅列ですが、実際に送られているメールをみるとカタカナ、漢字が混じって文字化けしています。 本文のxxxxxxxxxxxxxxxもカタカナ、漢字が混じって文字化けしています。 よろしくお願いいたします。 ちなみに、text/htmlで行ったときも同様でした。 | ||||||||||||||||
|
投稿日時: 2006-04-17 19:52
因みに、localで行うと(Tomcatなどを使用して)文字化けはおこりませんでした。
SetSubject SetText の前で、何かエンコードしなくてはいけないのでしょうか? | ||||||||||||||||
|
投稿日時: 2006-04-18 00:28
その xxxx の部分を正確に書いて頂かないと、判断がつきません。 msg.setSubject("ほげほげ", "iso-2022-jp" ); msg.setText("ほげほげボディ\r\n", "iso-2022-jp"); であれば、
となるのが正解です。 (■のところはESCコードですが、メモ帳で開くと半角幅の■に見えます)
「localでは」というのは、どういう意味でしょうか? javaのメール送信プログラムを実行しているのと同じマシンをSMTPサーバとした、という意味ですか? tomcatは、どう関係しているのでしょうか?
必要ありません。 メールに必要なエンコードは、すべてjavamail任せでできます。 tomcatが唐突に話題に出てくる辺りは、システム構成を明らかにして頂かないと何ともいえませんが・・・ # 済みません。正解のエンコード例のところが変に処理されてしまって、何度も書き直しました。 # ここのCGIにも、色々と問題あるのだなぁ(笑) [ メッセージ編集済み 編集者: coasm 編集日時 2006-04-18 02:19 ] | ||||||||||||||||
|
投稿日時: 2006-04-18 13:12
Webアプリからメール送信しようとしています。 ある画面からボタンを押下することによりあて先(Docomo携帯)にメールを送信します。 Subjectには、"こんにちは このシステムのご利用について" 本文には、"あいうえおアイウエオかきくけこカキクケコさしすせそabcde"+ "\r\n" + "\r\n" + "もうすぐゴールデンウィーク 5月3日"+ "\r\n" ; としました。 ↓PC上でTomcatを起動し、IEからhttp://localHost:8080/xxxxx/xxxxxでアクセスしWeb画面のOKボタンを押下し、メール送信したログです。 **************************************************************************** Subject: =?iso-2022-jp?B?GyRCJDMkcyRLJEEkTyQzJE4lNyU5GyhC?= =?iso-2022-jp?B?GyRCJUYlYCROJDRNeE1RJEskRCQkJEYbKEI=?= Mime-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit あいうえおアイウエオかきくけこカキクケコさしすせそabcde もうすぐゴールデンウィーク 5月3日 **************************************************************************** ↓サーバ側(Solaris)でTomcatを起動し、IEからhttp://xxxxxxxx/xxxxx/xxxxxでアクセスしWeb画面のOKボタンを押下し、メール送信したログです。 **************************************************************************** Subject: =?iso-2022-jp?B?GyhJJDMkISlLJEEkTyQzJE4lNyU5GyhC?= =?iso-2022-jp?B?GyhJJUYlGyRCYCYbKElOJDRNISlRJEskRCQkJEYbKEI=?= Mime-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit 、「、、、ヲ、ィ、ェ竺軸宍雫七、ォ、ュ、ッ、ア、ウ叱執失嫉室、オ、キ、ケ、サ、スabcde 、筅ヲ、ケ、ー・エ。シ・。ゥ・ヌ・。ゥヲ・」。シ・ッ 5キ。ゥ3ニ。ゥ **************************************************************************** となりました。 | ||||||||||||||||
|
投稿日時: 2006-04-18 14:54
こんにちは。
横から失礼します。 なにやらEUCの文字列をShift_JISで表示させた際の 文字の化け方っぽいですが、設定する文字列が すでに化けているということは無いでしょうか。 設定する値をどのように生成しているのかわかりませんが、 仮にすでに化けているのであれば、ぱっと思いつく範囲では、 以下のようなパターンが考えられると思います。 1.メール内容のテンプレートファイルを読み込んでいる場合 EUCのテンプレートファイルをShift_JISとして読み込んでいる 2.設定値をハードコードしている場合 EUCのソースファイルをShift_JISとしてコンパイルしている 3.ユーザがブラウザで入力した値を設定している場合 ブラウザから送信される文字コードとServletが受け取る際の文字コードが 異なっている | ||||||||||||||||
|
投稿日時: 2006-04-18 23:38
「メール送信したログです」というのは、msg.writeTo(...) でログを記録したものを
Windowsのメモ帳か何かで見たらそうなっていた、ということでしょうか? Subjectは正しくエンコードされていますが、本文はISO-2022-JPではなくて プラットホームのデフォールトエンコーディングでエンコードされてしまっているようです。 ソースコードの記述には問題ないので、なぜそんなことになってしまうのか、わかりません。 逆の例(本文は問題ないのに、Subjectがデフォールトエンコーディングになってしまう)が 最近ありました。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28818&forum=12 同じような原因かも知れないので、javamailのバージョンとCLASSPATHを確認してみた方が 良いかも。 |