NONE TITLE 3.html
Keywords: NONE TITLE,fml, flexible mailing list manager, not listserv style but fmlserv emulates listserv or majordomo style

[PREVIOUS CHAPTER] [______TOC_______]

3 フックの一覧

    インタプリタなので(例えば config.ph に)フックを定義すれば適当な場所で
    そのHOOKは評価され実行されます。

    そのフックでちょっと複雑な設定やダイナミックなサーバの挙動の変更をした
    りできます。config.ph で定義するのでMLが複数あってもMLごとに変更できる
    わけです。一方 sitedef.ph で行なえばML共通のHOOKを仕掛けることができま
    す。

    3.1	$START_HOOK

    評価されるタイミングは、
    	ヘッダの各フィールドの切り出しは終っている。
    	が、配送orコマンド本体を行なう前
    である。

    例: 配送前にもし #ではじまらない行が８行以上あれば、たとえ#ではじまる
    行があっても普通のメールとおもうようにする。

    $START_HOOK =q%
        if ($Envelope{'nlines'} - $Envelope{'nclines'} >= 8) {
    	undef $Envelope{'mode:uip'};
        }
    %;

    3.2	$HEADER_ADD_HOOK

    ヘッダに”新たに”つけくわえるフィールドをかいてカスタマイズするための
    フック。

    現在では $body という変数はこのためだけに使われる。
    ＃注意：昔は違った

    例(昔のやり方):

        $HEADER_ADD_HOOK = q#
    	$body .= "X-Baycity-Weather: Mizumaki\n";
        #;

    ヘッダに X-Baycity-Weather: Mizumaki とつけくわえる(意味不明(笑))
    現在では同じことは例えば

    	&DEFINE_FIELD_FORCED("X-Baycity-Weather","Mizumaki");

    のような関数でできる。

    例２:

    Message-ID: <19950518.01905.Elena.Lolobrigita@Baycity.asia>

    $HEADER_ADD_HOOK = q#
       $body .= "Message-ID: ".
    	sprintf("<%4d%02d%02d.%05d.%s>\n", 1900 + $year, $mon + 1, $mday, $ID,
    	"Elena.Lolobrigita@Baycity.asia");
    #;

    3.3	$DISTRIBUTE_START_HOOK

    配送を始める関数に入った時に最初に評価されるHOOK

    3.4	$SMTP_OPEN_HOOK

    配送時にはこのフックの後 Sendmail へ渡すヘッダの処理が始まります。ここ
    で強制的かつダイナミックにヘッダの内容を変えたりすると効果的です。単に
    ヘッダの各フィールドを書き換えるのなら &DEFINE_FIELDうじゃうじゃ 関数
    シリーズが用意されています。そちらを使うのがよいでしょう。
    SMTPという名前がついていますがSMTP汎用ではありません。歴史的な名前です。
    ../header_rewrite 5.1../header_rewrite 5.2

    例:	Reply-To: フィールドをML自体へ強制書き換え
    	&DEFINE_FIELD_うじゃうじゃ以外にも別解はいくつかあるが解1

    $SMTP_OPEN_HOOK = q#
    	$Envelope{'fh:reply-to:'} = $MAIL_LIST;
    #;

    例2:	Precedence: を bulk へ

    $SMTP_OPEN_HOOK = q#
    	$Envelope{'h:Precedence:'} = 'bulk';
    #;

    Precedence: に関しては実は config.ph で $PRECEDENCE = 'bulk'; でＯＫで
    す。

    3.5	$DISTRIBUTE_CLOSE_HOOK (SMTP_CLOSE_HOOK)

    $DISTRIBUTE_CLOSE_HOOK は配送が終った後でかつまだロックされている状態
    で実行されます。具体的には &Distribute; を離れる直前に実行されます。
    $SMTP_CLOSE_HOOK は昔の名前です。

    3.6	$FML_EXIT_HOOK

    fml.pl が最後に実行する フック。このときすでに 『排他制御の lock が解
    除されている』いることに注意して下さい。

    3.7	$FML_EXIT_PROG

    In the last of fml.pl, FML starts $FML_EXIT_PROG as a new process by
    exec(2) system call (precisely speaking via exec(3)).

    3.8	$MSEND_START_HOOK

    After msend.pl is initialized, msend.pl evaluates this hook in the
    begging of the main function. See msend.pl internal.

    3.9	$MSEND_HEADER_HOOK

    In the header generation when sending digest mail creation time.

    3.10	$MSEND_OPT_HOOK

    msend.pl evaluates $MSEND_OPT_HOOK in the &MSendInit.

    例:
    デフォールトでは、まとめおくり や mget の時の Subject は

    Subject: Matomete Send [PLAINTEXT(UNIX FROM)] (1/1) (Elena Lolobrigita ML)

    のようになります。が    ↑↑↑↑ここのところの文章がきにいらないので
    OVERWRITE したいときは、

    $MSEND_OPT_HOOK = q%
        $MSendOpt{'#uf'} = "#Overwritten... $MSendOpt{'#uf'}";
    %;

    このように、
    		$MSEND_OPT_HOOK
    に 連想配列の

    	#モード の値が #説明の文章

    のようにかいてください。なにをやってるのかは、libutils.pl の中の
    sub MSendModeSet  という関数を見るとわかるとおもいます。
    ../digest 2.6

    3.11	$REPORT_HEADER_CONFIG_HOOK

    SMTP 配送ライブラリへ渡す直前に評価されるフック。

    3.12	$COMMAND_HOOK (obsolete on to add new commands technique)

    現在のfmlでは %Procedure に登録していない関数を実行しようとするとエラー
    になります。そのため $COMMAND_HOOK によるコマンドの実行はできません。

    3.13	$MODE_BIFURCATE_HOOK

    モードが分岐する関数の中で呼ばれるHOOK。ほとんど先頭で呼ばれる。実際に
    は sub ModeBifurcate を見ないと何だか分からないだろう。

    3.14	$COMMAND_FILTER_HOOK
    ../filter 4.1

    3.15	$REJECT_COMMAND_FILTER_HOOK
    ../filter 4.1

    3.16	$DISTRIBUTE_SUMMARY_HOOK

    $DISTRIBUTE_SUMMARY_HOOK = q#
    	&Append2(sprintf("%s [%d:%s] %s",
    			 $Now, $ID, substr($From_address, 0, 15), $s),
    		 $SUMMARY_FILE);
    #;

    このHOOKが評価される時 $s は subject になっています。