## CGIから送信するメールのヘッダに日本語を用いるには

トップ > アラカルト > CGIから送信するメールのヘッダに日本語を用いるには

#### ■ CGIから送信するメールのヘッダに日本語を用いるには

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);
    }

Copyright (C) 1996-1998 杜甫々
1998年5月24日
http://www.tohoho-web.com/wwwxx006.htm