JavaMail 日本語の文字化け

ここでは、JavaMailを利用しメッセージを送る時、起こる文字化けについて纏めたいと思う。
ちなみに、メイラーによる文字化けの現象に関してはreferenceを参考してほしい。
タイトルと本文に分けて紹介しよう。テスト環境は以下のとおり。

区分  環境
JavaMailv1.4
JDK1.5
Web serverTomcat5.5
Mail serverMail 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 ****************/

reference

コメント

コメントを入力. Wiki文法が有効です:
H᠎ R​ V U W
 

QR Code
QR Code study:java:jmail (generated for current page)