カスタマイズの事例

fml8 チュートリアル (バージョン 7.99.1-20180910)
Prev |  | Next

# Chapter 17. カスタマイズの事例

# ケーススタディ: 自動ファイル送り返しサーバ

配送プロセス( /usr/local/libexec/fml/distribute )を改造し、 どんなときでも /some/where/help ファイルを送り返すことを考えます。 たとえば help@fml.org ＭＬを作り、このアドレスにメールを送ると (うむをいわさず:-)ヘルプファイルを送り返すというものです。

この場合 config.cf (e.g. /var/spool/ml/help/config.cf)の例は、 次のようになります。

    article_post_restrictions = permit_anyone

config.cf ファイルの =cut 行以降に hook を書きます。

    $distribute_run_start_hook = q{

            $curproc->reply_message( {
                    type        => "text/plain; charset=iso-2022-jp",
                    path        => "/some/where/help",
                    filename    => "help",
                    disposition => "help example",
            });

            $curproc->stop_this_process();

    };

最後の

    $curproc->stop_this_process();

が fml4 の $DO_NOTHING 変数にあたりますが、fml8 ではメソッドです。 これで、この HOOK 以降、正常の処理が無視されるようになります。 つまり、なにも実行されなくなるというわけです。

正確には「身のある処理は何も実行されません」が、 reply_message() メソッドでメッセージキューに入れられたメッセージを 送信する処理は行なわれるので、メッセージの送信は行なわれます。

## レシピ’s

1. サービス案内を自動で送り返す
2. お礼”も”返す意見受け付け用ＭＬ

1. サービス案内を自動で送り返す

コマンドメールで guide というコマンドを受けるとガイドを送り返します。 この仕組みを応用すると良いでしょう。

デフォルトではメッセージテンプレートのガイド案内が使われます。 fml4 のようにＭＬのホームに guide ファイルがあるわけではありません。 もっとも fml4 との互換性維持のために、 各ＭＬのホームディレクトリに guide ファイルをおけば、 それを送り返してくれます。

「メールの内容にかかわらず常にガイドを送り返す」には、 もうひとひねり必要です。

このためには次のように HOOK で常に guide コマンドを実行するようにする とよいでしょう。なお、この例では通常の処理は行なわないようにしています。

    $distribute_run_start_hook = q{

    	# guide コマンドを呼び出します。
    	# guide コマンドの内容は汎用のメールキューシステムに渡されます。
    	use FML::Command;
    	my $dispatch = new FML::Command;
    	my $context  = $curproc->command_context_init("guide");
    	$dispatch->guide($curproc, $context);

    	# 通常の処理を行ないません。
    	$curproc->stop_this_process();

    };

    # コマンドメールでも同じくガイドを送り返すように
    $command_mail_run_start_hook = $distribute_run_start_hook;

fml4 と異なり、配送用とコマンドメール用それぞれのプロセスごとに HOOK が分かれていることに注意して下さい。このため最後に同じ内容のコマンドメー ル用の HOOK も定義する必要があります(コピーしてください)。

    $command_mail_run_start_hook = $distribute_run_start_hook;

2. お礼”も”返す意見受け付け用ＭＬ

「意見受付」用のＭＬを考えてみましょう。

前レシピに似ていますが、少し違います。

このＭＬに意見を送ってくれた人には、 とりあえずお礼の返事 「ご意見ありがとうございました。返事はしばらく待ってね。」を出し、 投稿されたメールを関係者に配送します。 よって、 (1) だれでも投稿できて、 (2) お礼を常に出し、 (3) さらに普通のＭＬとして動作する、 ように設定します。 (3) は「返事の前に、関係者が議論するため」の機能という想定です。

    [config.cf]

    article_post_restrictions = permit_anyone

    =cut

    $distribute_run_start_hook = q{
        my $cred   = $curproc->credential();
        my $sender = $cred->sender();

        # ＭＬのメンバーでないならガイドを送り返します。
        # ＭＬのメンバーに対しては普通のＭＬとなります。
        unless ($cred->is_member($sender)) {

    	# guide コマンドを呼び出します。
    	use FML::Command;
    	my $dispatch = new FML::Command;
    	my $context  = $curproc->command_context_init("guide");
    	$dispatch->guide($curproc, $context);
        }

    };

Prev | Home | Next
リモート管理者のパスワード | Up | ケーススタディ: 誰でもコマンドメールが使える

fml 8.0 (fml-devel) project homepage is www.fml.org/software/fml8/.
fml 4.0 project homepage is www.fml.org/software/fml4/.
about one floppy bsd routers, see www.bsdrouter.org/.
other free softwares are found at www.fml.org/software/.

author's homepage is www.fml.org/home/fukachan/.
Also, visit nuinui's world :) at www.nuinui.net.

For questions about FML, e-mail <fml-bugs@fml.org>.