next up previous contents
Next: 6.7 テスト方法 Up: 6. mail の設定 Previous: 6.5 インストール

6.6 日本語の問題

ここまでで通常のメールの設定は終了しているのですが、よく問題にされる 事として日本語の問題があります。一般に、Internet では、日本語のメールには JIS code を用いる事が推奨されています(8bit を通さない MTA の対策として)。 しかし、メーカー付属の MUA は未だに EUC を使ったりしているものもあります。 また、Sun の mailtool は本文の JIS code への変換はサポートしているのですが、 Subject:, Signature の変換はサポートしていません。勿論、Subject 行には JIS も使うべきではないのですが、少なくとも変換はしておくべきでしょう。 Signature も同様です。一方、新しいデスクトップ環境である CDE の dtmail はこうした条件を満たしていますが、MIME エンコーディングに quoted-printable という方法を採用しており、これはあまり標準的なものとは言えません。 日本では、JIS code の MIME エンコーディングは Base64 が一般的です。

参考
SunOS 4.x の /usr/ucb/mail ではそれ程問題ではなかったのですが、 Solaris の /usr/ucb/mail は 4.x の mail とは完全に互換ではありません。/bin/mailx を mv し、代わりに /usr/SUNWale/bin/mailx にシンボリック・リンクを張って、これを使うように した方が良いでしょう。
とは言え、ウィンドウ・インターフェースの mailtool などを使わざるを得ない サイトでは、何等かの対策をシステム側で行わざるを得ません。以前はこうした 処置は FAQ でしたが、最近の sendmail, CF にはその対策があらかじめ用意 されています。まず、送る場合の問題ですが、以下のようなシェルスクリプト を用意し、sendmail の代わりに使用します。

#!/bin/sh
# change following line
ver="8.9.1"
mxver="mx"
#
arcname=`uname -r`
ostype=`uname -s`
type="$ver.$ostype$arcname.$mxver"

if test `basename $0` = newaliases
then
        exec /usr/lib/sendmail.$type -bi $*
fi
if test `basename $0` = mailq
then
        exec /usr/lib/sendmail.$type -bp $*
fi
daemon=no
sending=no
for i in $*
do
        case $i in
                -bd|-q*) daemon=yes;;
                -t) sending=yes;;
                -*) ;;
                *) sending=yes;;
        esac
done
if test $daemon = yes -o $sending = no
then
        exec /usr/lib/sendmail.$type $*
else
        exec /bin/nkf -j | /bin/toMime | /usr/lib/sendmail.$type $*
fi

上のスクリプトでは、sendmail の名前はそれぞれ sendmail.8.9.1.SunOS4.1.3-JL.mx, sendmail.8.9.1.SunOS5.5.mx 等のように uname -r,-s の結果に応じて OS に適した名前が選択されるようになっており、 様々な OS が混在していていもインストールする sendmail の名前さえ注意すれば sendmail.sh 自身は全く同じで良いようになっています。

更に、subject 行の日本語に対応するために、toMime というソフトを使って ISO-2022-JP の MIME code 化を行っています。

次に、受け取る場合の設定ですが、あらかじめ CF にはそのための仕組みが用意 されています。その前に、ローカルにメイルが配送される仕組みを復習しておくと、 まず最初に sendmail がローカル配送であると認識した場合には sendmail.cf の ローカル配送ルールが適用され、次にローカルメーラが起動され、そのプログラム にメイルが渡されます。従って、ローカルメーラに細工を施せば良いのですが、 CF の作者は更に次のような事態を想定しました。すなわち、ユーザーによって 漢字コードは EUC が必要な人もいれば、JIS が必要な人もいるだろう(場合に よっては SJIS な人も)。従って、ユーザーが個別にデフォルト設定以外に 選択可能なようにする必要がある、と。勿論、そうした個別設定を読み取るシェル スクリプトをローカルメーラとして用意しても良いのですが、元々 sendmail には ユーザーの個別設定を読み取る機能が用意されています。~/.forward が それです。そこで、~/.forward に次のような設定をし、それを sendmail.cf のローカルルールで処理できるようにしてあります。

.forward の例

\testuser.euc

これを処理するための sendmail.cf のローカルルールは以下の通りです (これは、KANJI_CONVERSION を yes にすると自動的に生成されます)。

# remaining names must be local
# mailer dispatching rules for kanji conversion
R$*.jis         $#local$@-jis$:$1         JIS(ISO-2022-JP)
R$*.sjis        $#local$@-sjis$:$1        shift JIS
R$*.euc         $#local$@-euc$:$1         EUC-Japan
R$*.nc          $#local$@-nc$:$1          no conversion
R$*             $#local$:$1               regular names

これによって、.forward.euc があれば、ローカルメーラを -EUC オプションをつけて呼び出します。ローカルメーラ・シェルスクリプト はこれらのオプションによって動作を変えるようになっています。

シェルスクリプトは実際には以下のようになっています。

#!/bin/sh -
#!/bin/sh -p -          # for Solaris 2.5 or ...

# @(#)binmail.kc        1.7 (motonori/WIDE) 01 Jan 1997

# kanji conversion supported local mailer
# by motonori@wide.ad.jp

# This script does not require SUID root.

# paths
#MAILER=/bin/mail
#MAILER=/bin/rmail
#MAILER=/bin/mail.local
#MAILER=/bin/lmail
#MAILER=/usr/ucb/mail
#MAILER=/usr/ucblib/binmail
MAILER=/usr/libexec/mail.local

# kanji conversion filter definision
KC_FILTER=/usr/local/bin/nkf    # this binary must be in local (non NFS) disk
KC_FILTER_J="$KC_FILTER -j"     # convert to JIS (ISO-2022-JP)
KC_FILTER_S="$KC_FILTER -s"     # convert to Shift JIS
KC_FILTER_E="$KC_FILTER -e"     # convert to EUC-Japan

# default filter
#FILTER="$KC_FILTER_J"
#FILTER="$KC_FILTER_S"
#FILTER="$KC_FILTER_E"
FILTER=""

case "$1" in
-r|-f)
        # sender is specified before kanji flag
        RFOPT="$1"
        SENDER="$2"
        shift
        shift
        ;;
*)
        RFOPT=""
        SENDER=""
        ;;
esac
case "$1" in
-JIS|-jis)
        # convert to JIS (ISO-2022-JP)
        shift
        FILTER="$KC_FILTER_J"
        ;;
-SJIS|-sjis)
        # convert to Shift JIS
        shift
        FILTER="$KC_FILTER_S"
        ;;
-EUC|-euc)
        # convert to EUC-Japan
        shift
        FILTER="$KC_FILTER_E"
        ;;
-NC|-nc)
        # no conversion
        shift
        FILTER=""
        ;;
-|"")
        # use default
        shift
        ;;
esac

case "$RFOPT" in
"")
        case "$FILTER" in
        "")     exec $MAILER "$@" ;;
        *)      $FILTER | exec $MAILER "$@" ;;
        esac ;;
*)
        case "$FILTER" in
        "")     exec $MAILER "$RFOPT" "$SENDER" "$@" ;;
        *)      $FILTER | exec $MAILER "$RFOPT" "$SENDER" "$@" ;;
        esac ;;
esac

但し、標準で用意されているのは EUC, JIS, SJIS 書き込みだけですので、 Sun の mailtool のような MIME decode 機能を持たないものに対応はしていません。 そこで、本学では次のように変更しています。

#!/bin/sh -
#!/bin/sh -p -          # for Solaris 2.5 or ...

# @(#)binmail.kc        1.7 (motonori/WIDE) 01 Jan 1997

# kanji conversion supported local mailer
# by motonori@wide.ad.jp

# modified N.Kanayama
# for support MIME decode and EUC conversion
# you must change sendmail.cf adding following line
# R$*.meuc    $#local$@-meuc$:$1      MimeEUC-Japan
# after the line contained 'R$*.euc '.

# This script does not require SUID root.

# paths
#MAILER=/bin/mail
#MAILER=/bin/rmail
MAILER=/bin/mail.local
#MAILER=/bin/lmail
#MAILER=/usr/ucb/mail
#MAILER=/usr/ucblib/binmail
#MAILER=/usr/libexec/mail.local

# MIME decoder
DECODE=/bin/fromMime
MIME=""

# kanji conversion filter definision
#KC_FILTER=/usr/local/bin/nkf   # this binary must be in local (non NFS) disk
KC_FILTER=/bin/nkf      # this binary must be in local (non NFS) disk
KC_FILTER_J="$KC_FILTER -j"     # convert to JIS (ISO-2022-JP)
KC_FILTER_S="$KC_FILTER -s"     # convert to Shift JIS
KC_FILTER_E="$KC_FILTER -e"     # convert to EUC-Japan

# default filter
FILTER="$KC_FILTER_J"
#FILTER="$KC_FILTER_S"
#FILTER="$KC_FILTER_E"
#FILTER=""

case "$1" in
-r|-f)
        # sender is specified before kanji flag
        RFOPT="$1"
        SENDER="$2"
        shift
        shift
        ;;
*)
        RFOPT=""
        SENDER=""
        ;;
esac

case "$1" in
-JIS|-jis)
        # convert to JIS (ISO-2022-JP)
        shift
        FILTER="$KC_FILTER_J"
        ;;
-SJIS|-sjis)
        # convert to Shift JIS
        shift
        FILTER="$KC_FILTER_S"
        ;;
-EUC|-euc)
        # convert to EUC-Japan
        shift
        FILTER="$KC_FILTER_E"
        ;;
-MEUC|-meuc)
        # convert to MIME decode and EUC-Japan
        MIME="decode"
        shift
        FILTER="$KC_FILTER_E"
        ;;
-NC|-nc)
        # no conversion
        shift
        FILTER=""
        ;;
-|"")
        # use default
        shift
        ;;
esac

case "$RFOPT" in
"")
    case "$FILTER" in
    "")     exec $MAILER "$@" ;;
    *)
            case "$MIME" in
            "")     $FILTER | exec $MAILER "$@" ;;
            *)      $DECODE | $FILTER | exec $MAILER "$@" ;;
            esac ;;
     esac ;;
*)
     case "$FILTER" in
     "")     exec $MAILER "$RFOPT" "$SENDER" "$@" ;;
     *)
         case "$MIME" in
         "")     $FILTER | exec $MAILER "$RFOPT" "$SENDER" "$@" ;;
         *)      $DECODE | $FILTER | exec $MAILER "$RFOPT" "$SENDER" "$@" ;;
         esac ;;
     esac ;;
esac

これに対応した sendmail.cf を作成するように あらかじめ CF のパッケージに組み込むには、CF-3.7Wpre6/Master/kanji を以下の例の1行目の下に2行目を追加しておくだけです。 但し、KANJI_MEUC_USERS で指定したユーザーに自動的には対応していません。 (ユーザーが .forward を書いた場合のみに対応。)

R$*.euc        $#local$@-euc$:$1           EUC-Japan\
R$*.meuc       $#local$@-meuc$:$1          Mime-decoded and EUC-Japan\

toMime は、mimehead.tar.gz というパッケージにあるものを利用。

このような MIME に対するシステム側での対応は異論もあるでしょう。本来 MUA が対応するべきものですが、現状では緊急避難的な措置としてやむを得ない でしょう。

ここで出てくる nkf は、汎用日本語コード変換で、新しいバージョンでは MIME decode もサポートしていますが、行分割された時に問題になることも あるので、ここでは fromMime を使ってデコードしています。



Noriyo Kanayama