Path: sranha!katsu From: katsu@sra.co.jp (WATANABE Katsuhiro) Message-ID: Date: 21 Dec 90 12:31:19 Organization: Software Research Associates, Inc.,Japan In-reply-to: sato@atlas.rc.m-kasei.co.jp's message of 13 Dec 90 00:52:23 GMT Newsgroups: fj.mail Subject: Re: How to describe sendmail.cf ? Distribution: fj References: 記事 で sato@atlas.rc.m-kasei.co.jp (Nobuyuki SATO 3250) さんいはく > 商用のパソコン通信のメイルと UNIX メイルをつなぐ PSMET という > システムを使って NIFTY serve とうちの LAN の間でメイル交換をしています。 > このシステムでは psmet というダミーのユーザーにメイルを送るといったん > スプールされ NIFTY へのポーリングの際に送ってくれます。相手の ID の指 > 定はメイルの先頭に次のようなコントロール行 > #delay XYZ12345 nifty > をつけることで指定できます。 > XYZ12345@nifty へメイルを送ると自動的にメイルの本 > 文の先頭に > #delay XYZ1234 nifty > を挿入してくれて、かつ宛先を psmet にするようにできないでしょうか? psmet のシステムの詳細がわからないのですが、細かい部分(From: フィールドに気をつかわなくていいのか?ウサン臭いアドレスをどう 処理するか?メイラーのフラグは?)を避けてアイデアだけ示しますが、 次のような戦略はどうでしょう? [1]本文の先頭に #delay.... を挿入して PSMET システムに渡す psmet というメイラーを作り、...... [2]相手が user@nifty だったら psmet メイラーを使うように sendmail.cf を書き換える(新たに作る)。 [1]psmet メイラーを作る sendmail には、本文を書き換えてくれるような仕組みはないようです。 したがって今回のように本文をいじらなければならない場合は、書き換えて さらに以降の処理を担当してくれる(psmet)メイラーを新たに定義しなければ ならないと思います。また、論理的な整合性からも、「PSMET システムに 送るメールは psmet メイラーに頼む」というのは理にかなっていると思います。 > このシステムでは psmet というダミーのユーザーにメイルを送るといったん > スプールされ NIFTY へのポーリングの際に送ってくれます。 というのは多分、‾psmet/.forward に "| PSMET-SYSTEM" のようなことが 書いてあるという意味だと思います。これならば、一つの引数をとってそれを nifty へのメールの宛先と解釈し、標準入力をメールの本文と解釈する psmetmail というプログラム(これすなわち psmet メイラー本体)は簡単に 作れると思います。 #!/bin/sh PIPE2PSMET=/tmp/pipepss$$ umask 077 exec 3>&1 > $PIPE2PSMET 4< $PIPE2PSMET rm -rf $PIPE2PSMET to=`echo $1 | sed 's/@nifty//'` while read line; [ -n "$line" ] do echo "$line" done echo "$line" echo "#delay $to nifty" while read line do echo "$line" done PSMET-SYSTEM <&4 >&3 のような意味のものを popen(3) とかを使って c で書くだけです。 (上のスクリプトはテストしていないし、多分遅いので。perl で 書けばきれいで速いのができるかな?) [2]nifty 宛は psmet メイラーに渡すよう sendmail.cf を書く これには(1)mailconf が出した sendmail.cf を修正する やりかたと、(2)psmet メイラーを mailconf のメイラー定義に 加えるやりかたの2通りがあると思います。 (1)今まで利用してきた mailconf が出した sendmail.cf を修正 まず、psmet メイラーの定義をします。どこでもいいのですが、 一応ルールセット0の前あたりに、 # # PSMET Mailer specification # Mpsmet, P=適当なパス/psmetmail, F=lsDFMuh, S=15, R=25, A=psmetmail $u # From: field S15 # To: field S25 #end# なんていうのを付け加えます。S=15, R=25 というのは、他で使われていない ルールセットの番号を選ばなければなりません。15 とか 25 は使われていない 可能性が高いでしょう。psmetmail は[1]で作ったプログラムです。問題は F= のフラグの指定ですが、これは PSMET-SYSTEM や Nifty のシステムを 考慮して決めて下さい。 次に、Nifty 宛のメイルを psmet メイラーに依頼するようにルールを 書き換えます。mailconf の出力では、どのメイラーを利用するかの判断は ルールセット7で行なわれます。「S7」で始まる行以降を見て下さい。 中でも、「#begin# *****$* $@<@行き先.smtp-n.mailer>:$1<@$2arpa>$3 R$*<@$*au>$* $@<@行き先.smtp-n.mailer>:$1<@$2au>$3 R$*<@$*bitnet>$* $@<@行き先.smtp-n.mailer>:$1<@$2bitnet>$3 R$*<@$*ca>$* $@<@行き先.smtp-n.mailer>:$1<@$2ca>$3 : : : : のように延々と記述されている場合もあるでしょう。とにかくここに、 R$*<@nifty>$* $@<@$w.psmet.mailer>:$1<@nifty>$2 という1行を加えれば良いはずです。$w の置かれている部分はメイラーを 呼び出す時に $h に設定されるのですが、どうせ psmet メイラーで $h は使わないので、$w の代わりに nifty とか psmet と書くのも 良い案かもしれません。また、 R$*<@nifty>$* $@<@$w.psmet.mailer>:$1$2 としてしまって(あるいはルールセット0の後半の mailer specific rewritings の辺りに @nifty を取り去るルールを書いておいて)、 psnetmail の方の to=`echo $1 | sed 's/@nifty//'` という処理をけずる方法(つまり psmet メイラーの引数に user@nifty では なくて user だけを渡すようにする方法)もあることでしょう。 (実は多分こっちの方が美しい?) (2)mailconf に psmet メイラー定義を加えるやりかた > sendmail.cf をうまく書けば可能でないかなとは思いついたのですが、 > mailconf でいつも楽をさせてもらっているので sendmail.cf に関しては良く > わからないのです。 今後 sendmail.cf を mailconf で再構築する度に(1)のような 作業を繰り返すのは面倒ですし、間違いの元です。もともと mailconf は、 Junet 専用に作られているわけではなくて汎用性がありますし、また メイラーの追加ぐらいは簡単にできるようになっています。 まず、mailer.dat に psmet メイラーを追加して、mailconf に psmet メイラーの存在を教えてあげます。 M psmet notouch nondelete # permit any addressing scheme という感じでしょうか? 次に、psmet の実際の呼び出し形式を MST/psmet.mst に定義してあげます。 ############################################################ ############################################################ ##### ##### PSMET Mailer specification ##### ############################################################ ############################################################ Mpsmet, P=適当なパス/psmetmail, F=lsDFMuh, S=&S&, R=&S&, A=psmetmail $u # From: field S&S& # To: field S&R& のような感じです。後は YOURHOST.dat に name: nifty lower_level_name: NONE nifty: psmet nifty のような行を追加して mailconf を起動するだけで目的の sendmail.cf が出来上がると思います。 また(1)でやったように psmet メイラーの引数に user@nifty では なくて user だけを渡すようにするには、host.mst に &Hrewrite& # mailer dependent rewriting R<@$+.psmet.mailer>:$*<@$+> $:<@$1.psmet.mailer>:$2 のような psmet メイラーの時だけに適用されるルールを書いておけば いいと思います。 長くなってしまいましたが、必要な作業の主なものは 1.本文の最初に #delay..... を入れて PSMET システムに渡す psmetmail を作る。 2.psmetmail を psmet メイラーとして sendmail.cf に登録する。 3.?????@nifty 行きのメイルは psmet メイラーに送るようにする。 という3点です。 骨格だけ示しましたが、上のような方法ではどうでしょうか? -- ----____----____ 渡邊克宏 SRAソフトウェア工学研究所