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

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

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

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

この場合の 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 以降、正常の処理が無視されるようになります。 つまり、なにも実行されなくなるというわけです。

レシピ’s

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

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

ガイドを送り返す仕組みを利用すると良いでしょう。デフォルトではテンプレー トのガイド案内が使われますが、各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として動作する、 ように設定します。

[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/fml/menu.ja.html.
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>.