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

Table of Contents
ケーススタディ: 自動ファイル送り返しサーバ
ケーススタディ: 誰でもコマンドメールが使える
ケーススタディ: コマンドメールを誰も使えないようにする
ケーススタディ: メールマガジン (1)
ケーススタディ: メールマガジン (2)
ケーススタディ: 誰でも投稿可能なML
ケーススタディ: フォローする場合なら誰でも投稿可能なML
ケーススタディ: PGP/GPG の電子署名で投稿制限をするML
ケーススタディ: PGP/GPG でコマンドメールを認証する
ケーススタディ: MLの階層化
自分のアカウントでMLを行ないたい (Procmail の利用)
ケーススタディ: オフィス (1)
ケーススタディ: オフィス (2)
レシピ’s [認証]
レシピ’s [登録関連]
レシピ’s [配送関連]

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

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

この場合 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. お礼”も”返す意見受け付け用ML

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

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

デフォルトではメッセージテンプレートのガイド案内が使われます。 fml4 のようにMLのホームに guide ファイルがあるわけではありません。 もっとも fml4 との互換性維持のために、 各MLのホームディレクトリに 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. お礼”も”返す意見受け付け用ML

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

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

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

[config.cf]

article_post_restrictions = permit_anyone

=cut

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

    # MLのメンバーでないならガイドを送り返します。
    # MLのメンバーに対しては普通のMLとなります。
    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);
    }

};

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>.