====== JavaMail 日本語の文字化け ====== ここでは、**%%JavaMail%%**を利用しメッセージを送る時、起こる文字化けについて纏めたいと思う。\\ ちなみに、メイラーによる文字化けの現象に関しては[[jmail#reference|reference]]を参考してほしい。\\ タイトルと本文に分けて紹介しよう。テスト環境は以下のとおり。\\ ^ 区分 ^ 環境 ^ |%%JavaMail%%|v1.4| |JDK|1.5| |Web server|Tomcat5.5| |Mail server|Mail Enable Standard Version **1.983**| {{keywords>JavaMail 文字化け Content-Transfer-encoding 7-bit}} ===== mail subjectの文字化けについて ===== タイトルが文字化けするのは一応charsetを確認する必要がある。\\ だいたい次の設定で文字化けが解消されるはずだ。\\ Message msg = new MimeMessage(session); ((MimeMessage)msg).setSubject("文字化けテスト","UTF-8"); ===== mail contentの文字化けについて ===== 本文の文字化けには二つを指定する必要がある。\\ 一つはcontent-typeの指定だ。本文がhtmlを含むtextであれば次のように指定する。 Message msg = new MimeMessage(session); msg.setContent("文字化けテスト
", "text/html;charset=UTF-8");
二つはContent-Transfer-encodingの設定だ。MUAによっては"7-bit"でencodingしないものもあるが、その対応については[[jmail#reference|reference]]を参考しよう。\\ msg.setHeader("Content-Transfer-Encoding", "7bit"); ===== converting UTF-8 to iso-2022-jp ===== charsetがutf-8で指定されている環境(JSP, requestを含めて)でメールを送信する際、charset=iso-2022-jpであれば、 次の手順を従えばいい。\\ ここでは、WindowsのOSを基準に説明する。 Unicodeをそのまま**「iso-2022-jp」**で変換してしまうと化けてしまうので、途中でWindowsの一般的なcharset("MS932")でbyteストリムで読込み、**「Shift_JIS」**で変換する。\\ この際、**「iso-2022-jp」**で変換すると化けてしまうので、注意しなくてはならない。 最後は、メール本文を**「text/html;charset=iso-2022-jp」**の形式で送信すればよい。\\ 結果的に、MUAでは日本語(自動選択)と認識される。次はencodingを行う部分だけ抜粋した部分だ。 //srcはメール本文 String message = new String(src.getBytes("MS932"),"Shift_JIS"); //msgはMimeMessageのインスタンス msg.setContent(message, "text/html;charset=iso-2022-jp"); ちなみに**「text/html;charset=Shift_JIS]**で指定した場合は、MUAで日本語(シフト JIS)で認識される。メールの確認はMicrosoft outlook2002とgmailで行った。 P.S)一部の特殊文字(例:「㈱」等)、Shift_JISで変換する際、文字化けするのがあるのでなるべくUTF-8のままで送信するのが望ましい。 ===== Sample code snippet ===== 以上の点を踏まえて、サンプルコードの一部を紹介しよう。\\ import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /**************** start ****************/ //Create properties, get Session Properties props = new Properties(); //If using static Transport.send(),need to specify which host to send it to props.put("mail.smtp.host", "localhost"); //To see what is going on behind the scene props.put("mail.debug", "true"); Session session = Session.getInstance(props); //Instantiatee a message Message msg = new MimeMessage(session); //from msg.setFrom(new InternetAddress("test@127.0.0.1")); //to msg.setRecipients(Message.RecipientType.TO, new InternetAddress("test@127.0.0.1")); //subject ((MimeMessage)msg).setSubject("テストメール","UTF-8"); //date msg.setSentDate(new Date()); //contect msg.setContent("本文
内容
表示", "text/html;charset=UTF-8"); //set transfer-encoding msg.setHeader("Content-Transfer-Encoding", "7bit"); //send mail Transport.send(msg); /**************** end ****************/
===== reference ===== - [[http://www.sk-jp.com/book/javamail/contents/javamail_ja_prob.html|JavaMail 文字化け]] - [[http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=12&topic=28818|JavaMail タイトルの文字化け]] - [[http://www.langedge.jp/blog/rsd.php?itemid=348|UnicodeからShift_JISへの変換 ]] ~~DISCUSSION~~