[PREVIOUS CHAPTER]

3 Hooks

    Perl is an interpreter language. FML evaluates several hooks in a lot
    of places. In this chapter we describe hooks. You can use complicated
    control of FML and dynamic configuration changes by using hooks.

    3.1	$START_HOOK

    FML evaluates $START_HOOK, after header parsing and fundamental checks
    but before main distribution and command functions

    3.2	$HEADER_ADD_HOOK

    Evaluated before header generation of distribution articles. $body
    variable is used.

    Example: add the field "X-Baycity-Weather: Mizumaki" (riddle:-).

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

    is the same as

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

    Example 2: append the original Message-Id.

    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

    evaluated in the begging of &Distribute which is the main function of
    distribution.

    3.4	$SMTP_OPEN_HOOK

    The variable name is historical, so ambiguous. Today this hook is
    evaluated after $DISTRIBUTE_START_HOOK but before $HEADER_ADD_HOOK.
    You can understand faster to see libdist.pl.

    Example: Overwrite Reply-To: field of distribution mail. Today we
    recommend to use $DEFINE_FIELD_FORCED.

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

    Example 2: overwrite Precedence: to set "bulk".

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

    3.5	$DISTRIBUTE_CLOSE_HOOK (SMTP_CLOSE_HOOK)

    $DISTRIBUTE_CLOSE_HOOK is evaluated in the last of &Distribute, which
    is the main function of distribution. $SMTP_CLOSE_HOOK is an old
    obsolete name, so both are same.

    3.6	$FML_EXIT_HOOK

    fml.pl evaluates this hook in the last. This evaluation is after
    unlock! This hook is the last hook but $FML_EXIT_PROG is executed
    after this since $FML_EXIT_PROG is to start a new process.

    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.

    In default, digest delivery's subject is

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

    To overwrite this, you can set the following ...

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

    		$MSEND_OPT_HOOK

    3.11	$REPORT_HEADER_CONFIG_HOOK

    In SMTP library, this hook is evaluated just before the mail is passed
    to &Smtp; This routine is used in a reply mail of command results.

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

    3.13	$MODE_BIFURCATE_HOOK

    Called in the first stage of &ModeBifurcate where fml.pl running mode
    changes.

    3.14	$COMMAND_FILTER_HOOK

    3.15	$REJECT_COMMAND_FILTER_HOOK

    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);
    #;

    $s is the subject when this hook is evaluated.