coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

sendmail.mc と sendmail.cf とRコマンドテスト

2007-04-24 20:08:42 | sendmail
前回 sendmail.cf を簡単にまとめてみて、だんだん気分が盛り上がってきましたので、R(ルール)コマンドをいろいろ試して見たくなりました。

そのための準備として、sendmail.mc と sendmail.cf の関係を少し見てみます。

./cf/README によると、sendmail.mc は次のような構成で作ると良いみたいです。
  VERSIONID
  OSTYPE
  DOMAIN
  FEATURE
  local macro definitions
  MAILER
  LOCAL_CONFIG
  LOCAL_RULE_*
  LOCAL_RULESETS

ここで、local macro definitions は、GNU m4 の define() マクロで指定するタイプの設定です。

生成される sendmail.cf は、ここでの標準の sendmail.cf で大体次のようになっていました。
  バージョン情報
  C , F , D コマンド
  O コマンド
  Q コマンド
  P コマンド
  T コマンド
  H コマンド
  [ REWRITING RULES のコメント ]
     Scanonify=3 のルールセット
      Sfinal=4 のルールセット
      Sparse=0 のルールセット
      Slocaladdr=5 のルールセット
      Scheck_ 系のルールセット
      その他関連ルールセット
  [ MAIL FILTER DEFINITIONS のコメント ]
    [ Local and Program Mailer specification のコメント ]
      SEnvFromL ルールセット
      SEnvToL ルールセット
      SHdrFromL ルールセット
      SHdrToL ルールセット
      その他関連ルールセット
      Mlocal と Mprog の設定
    [ SMTP Mailer specification のコメント  ]
      SEnvFromSMTP ルールセット
      SEnvToSMTP ルールセット
      SHdrFromSMTP ルールセット
      SHdrToSMTP ルールセット
      その他関連ルールセット
      Msmtp とか Mesmtp の設定      

要するに膨大なオプションとルールセットの塊です。大まかな構成はしっかりしていますね。

さて、Rコマンドをテストするために、新たにルールセットを作りました。ここでは、使っていない番号 9 を利用します。こういう場合は、sendmail.mc の中で、LOCAL_RULESETS を使います。

この設定は、REWRITING RULES コメント下のルールセット群の一番下に展開されます。

例えば、

R<$+>       $1

をテストする場合は、sendmail.mc の最後に

LOCAL_RULESETS
Slocal_test=9
# Test of R command
R<$+>          $1
#
R$*            $@ RESULT : $1

を追加します。Rコマンドの lhs と rhs の間はタブ文字です。
この Rコマンドは括弧で囲まれた複数のトークンから括弧をはずすためのつもりです。ここで、
rhs の先頭の $@  は、それ以降の内容を出力として、そのルールセットを
                     終了させます。
                     つまり、サブルーチンのリターンですね。
                     配信エージェントを指定する $# も同じ動作
                     になっていますね。
rhs の先頭の $:  は、それ以降の内容を次のルールコマンドの lhs に渡し
                     ます。
                     Rコマンドのループ抑制です。

早速テストしてみます。sendmail は、コンパイルしたものを使います。
$ ln -s ../../obj.Linux.2.6.11-co-0.6.4.i686/sendmail/sendmail sendmail
$
$ sb Build sendmail.cf
$ ./sendmail -bt -C./sendmail.cf
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 9 <abc>
local_test         input: < abc >
local_test       returns: RESULT : abc
> 9 <<<abc>>>
local_test         input: < < < abc > > >
local_test       returns: RESULT : abc
> /quit
$

うまくいきました。ここで、テストしたRコマンドがループとして動作し、複数の括弧( < > )がはずされたことがはっきり理解できます。この手のプログラム言語は、熟語のようなよく使う形式が現れますので、sendmail.cf のその他の Rコマンドを見ているうちになれてくるんじゃないかと思います。

coLinux なので、Rコマンドでルールセット呼び出し(サブルーチン呼び出し)なども気楽に試せます。ただし、外にメールを送る場合は正しく設定する必要があります。

ブログですから、次回もう少し遊んで見たいです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする