#!/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\
このような MIME に対するシステム側での対応は異論もあるでしょう。本来 MUA が対応するべきものですが、現状では緊急避難的な措置としてやむを得ない でしょう。
ここで出てくる nkf は、汎用日本語コード変換で、新しいバージョンでは MIME decode もサポートしていますが、行分割された時に問題になることも あるので、ここでは fromMime を使ってデコードしています。