====== 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~~