日本語をISO-2022JPに変換する



ただし、SmtoClientクラス自体の使い方はそう難しくはないのですが、日本語で送信をする場合には注意が必要です。そのまま日本語のStringを設定して送ると、タイトルとメール本文が文字化けしてしまうからです。
日本語の文字コードを変換する処理を行わないで送信すると、このように受信したメールは文字化けしてしまいます。
この問題は、SMTPというプロトコルがどういうものかに関係してきます。インターネット関連の技術の多くは、当初、UNIXから生まれているため、英語圏の文字コード(7bit ASCII)が標準でした。このため、8bitを扱う日本語などの文字コードはそのままでは扱えなかったのです。

現在、日本語を扱うための技術はいろいろと登場していますが、もっとも原始的(?)で確実なのは、「日本語を、どのSMTPサーバでも扱える7bitのデータに変換する」というものでしょう。これには通常、ISO-2022JPという7bitの文字コードに変換するのが一番問題が少ないでしょう。

Javaでは、Stringインスタンスを作成する際、byte配列のデータをもとに特定の円コーディング方式によるテキストを生成することができるようになっています。これには、以下のようにしてnew Stringをします。
byte配列 = [String].getBytes( 文字コード );
String 変数 = new String( byte配列 );

わかりますか? 変換したいStringの「getBytes」を使ってbyte配列を取得します。このとき、変換したい文字コード名を引数に指定しておきます。こうして得られたbyte配列を元にnew Stringすると、その文字コードによるStringが得られるというわけです。

先のFreeSendMailerのactionPerformed部分をよく見てみましょう。、try構文のところで、最初に以下のような処理をしているのがわかります。
title1 = new String(title1.getBytes("ISO2022JP"));
msg = new String(msg.getBytes("ISO2022JP"));

これで、タイトルと本文メッセージのテキストをISO-2022JPに変換したStringを取得しているわけです。こうして得られたものをSmtpClientに渡して送信すれば、日本語を文字化けせずに正しく送ることができます。

今回作成したクラスでは、サーバ名、送信先などもすべて入力できるようにしてありますが、自作のプログラム内から利用するのであれば、これらは非表示にして、あらかじめ用意しておいた値を設定して送るようにすればよいでしょう。アレンジは簡単に行えると思いますので、それぞれでカスタマイズしてみてください。

また、プロバイダなどに用意されているSMTPサーバによっては、このような形でのメール送信を受け付けないものもあります。これについてはお使いのプロバイダ等にご確認ください。