目次
JavaMail 日本語の文字化け
ここでは、JavaMailを利用しメッセージを送る時、起こる文字化けについて纏めたいと思う。
ちなみに、メイラーによる文字化けの現象に関してはreferenceを参考してほしい。
タイトルと本文に分けて紹介しよう。テスト環境は以下のとおり。
区分 | 環境 |
---|---|
JavaMail | v1.4 |
JDK | 1.5 |
Web server | Tomcat5.5 |
Mail server | Mail Enable Standard Version 1.983 |
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("文字化けテスト<br/>", "text/html;charset=UTF-8");
二つはContent-Transfer-encodingの設定だ。MUAによっては“7-bit”でencodingしないものもあるが、その対応については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("本文<br/>内容<br/>表示", "text/html;charset=UTF-8"); //set transfer-encoding msg.setHeader("Content-Transfer-Encoding", "7bit"); //send mail Transport.send(msg); /**************** end ****************/
コメント