2009年3月31日火曜日

JavaMailで日本語のメールを送信する

メールを送信するというとても基本的なプログラムのサンプルです。
このプログラムは、10年以上も前に書いたものですが、基幹システムの運用状況をレポートするためのツールとして今でも良く利用されています。

あまりにも基本的な機能のためかどうか知りませんが、メールを送信するサンプルプログラムは意外と少ないようです。
たまにサンプルが在っても、JavaMailの簡単な使い方だったり英語圏のサンプルだったりするわけです。
若いプログラマーや外人プログラマーが日本語のメール送信機能をプログラミングすると、必ずといっていいほど文字化けします。
これは、日本語の文字コードが'JIS'/'shift JIS'/'EUC'/'UniCode' と複数のコード体系があることに起因しているからでしょう。
他の国では、中国なら中国語の文字コード、韓国ならハンブル文字コードというようにたいていは国毎にひとつの文字コードとなっているようで、外国人のプログラマーに日本の文字コードのことを説明してもなかなか理解してもらえません。
外国人のプログラマーはたいてい、ロケール情報を取得して取得した文字コードでエンコードしてメールを送ってしまいます。(上の画像を参照)
たいていは送信者がWindowsXPから送信しますので'ShiftJIS'で送信することになります。
ほとんどのメーラーは「JIS」コードしか扱えませんので、受け取り側は文字化けして読めなくなります。
ところが、最近はメーラーも賢くなってきて、文字コードを自動判別してしまうものがあります。このようなメーラーの出現によってプログラマーのミスが顕在化しなくなってしまいました。
 「テストではちゃんと動きましたよ。お客様がお使いのメーラーのバグじゃないですか」
などとほざく若いプログラマーも出現しはじめて、事態をいっそう混乱させています。

いまどきの日本のプログラマーよ、メールはこうやって送ればいいのだよ!

JapaneseMailSample.java

package jp.co.areaweb.tools.common;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class JapaneseMailSample {
static String to = "yuu.hayashi@gmail.com"; // あて先(To)
static String from = "hayashi.yuu@gmail.com"; // from
static String subject = "Java mail 日本語題名テスト"; // subject
static String content = "漢字本文\nカタカナ\nハンカク"; // content
static String mailHost = "smtp.gmail.com"; // SMTP(mailHost)

public static void main(java.lang.String[] args) {
try {
Transport.send(createMessage());
} catch (Exception e) {}
}

static MimeMessage createMessage() throws Exception {
Properties props = new Properties();
props.put("mail.smtp.host", mailHost);
Session session = Session.getDefaultInstance(props, null);
MimeMessage msg = new MimeMessage(session);

InternetAddress[] toList = new InternetAddress[1];
toList[0] = new InternetAddress(to);

// あて先(To)
msg.setRecipients(Message.RecipientType.TO, toList);

// 発信元(From)
msg.setFrom(new InternetAddress(from));

// 題名(Subject)
msg.setSubject(MimeUtility.encodeText(subject, "iso-2022-jp", "B"));

// 本文(Content)
MimeMultipart naiyou = new MimeMultipart();
msg.setContent(naiyou);
MimeBodyPart honbun = new MimeBodyPart();
honbun.setContent(content, "text/plain; charset=\"iso-2022-jp\"");
naiyou.addBodyPart(honbun);

return msg;
}
}

【ポイント】
題名と本文は、’JIS(ISO-2022-JP)’でエンコードしてから送ること!

実行には「mail-1.4.jar」と「activation-1.1.jar」が必要です。

2009年3月27日金曜日

PuppyLinux を自動起動させる

超初心者ねた

最近、PuppyLinuxにはまっている・・・
WindowsXPを入れると使い物にならないPC(Pen3-450MHz,128MB)にPuppyを入れると見事に現役に復帰した。
WindowsではできなかったネットラジオからのMP3もいとも簡単に実現したうえに、YouTUBEやらDivXまでこの非力なマシンでこなしてしまったのには驚いた。
昨日まで産業廃棄物だったものがいまや、Core2Duoマシンを押しのけてメインホームサーバーとしての地位を確立してしまいました。

さて、PuppyをインストしてHDDにFULLインストールしたところまではいいのだが、電源を入れると(リブートでも同様)GRUBの画面でEnterキーの入力待ちになってしまう。
ホームサーバーとしては、リモートで再起動させることが多いので、自動で起動してほしいのだが・・・

GRUBの設定ファイルをいじればよいのは判っているが、なんせ、GRUBなんぞ5年前にいじって以来そのままだからかな・・・また、GRUBの調査から始めるとなると気が重いな~

ということで、同じような問題に直面した人のためにPuppyLinuxが自動起動するように設定変更する手順を示します。


PuppyLinux をHDDにFULLインストールするとGRUB画面でEnterキー入力待ちになって自動起動しない問題の修正

(1) 「エディタ」を使って /boot/grub/menu.lst ファイルを開く
(2) 9行目の「#timeout 30」の1文字目の「#」を削除します。
  ついでに、30秒は長すぎるので5秒待ちに変更します。


7: #
8: # Start GRUB global section
9: timeout 5



(3) 保存しておわり