#!/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 を使ってデコードしています。