CGIスクリプトから送信する電子メールのヘッダに日本語を用いるには、漢字コードを次のような形式に変換してやる必要があります。(EUCやシフトJISでもちゃんと届いて読める場合もありますが、電子メールの規約上は変換が必要です。)Subject: =?iso-2022-jp?B?GyRCJEgkWyRbGyhK?=これは、日本語を一度JISコードに変換し、それを、BASE64という形式でエンコードし、前後に =?iso-2022-jp?B? と ?= をつけたものです。 BASE64エンコードは、3バイト分のバイトコードを、6ビットずつの4つのコードに分割し、この6ビットを A〜Z、a〜z、0〜9、+、/ の表示可能コードに振り分けるものです。 perlスクリプトで、このエンコードを行う方法を次に示します。jcode.pl は ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/から入手できます。
require "jcode.pl"; $xx = "とほほ"; $xx = &mail64encode($xx); print "$xx\n"; sub mail64encode { local($xx) = $_[0]; &jcode'convert(*xx, "jis"); $xx =~ s/\x1b\x28\x42/\x1b\x28\x4a/g; # 不要かも $xx = &base64encode($xx); return("=?iso-2022-jp?B?$xx?=\n"); } sub base64encode { local($base) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . "abcdefghijklmnopqrstuvwxyz" . "0123456789+/"; local($xx, $yy, $zz, $i); $xx = unpack("B*", $_[0]); for ($i = 0; $yy = substr($xx, $i, 6); $i += 6) { $zz .= substr($base, ord(pack("B*", "00" . $yy)), 1); if (length($yy) == 2) { $zz .= "=="; } elsif (length($yy) == 4) { $zz .= "="; } } return($zz); }