[PREVIOUS CHAPTER] [______TOC_______]
8 いろいろ

8.1	From と 配送先が一致した時に、配送を止めたい(dynamical skip?)

こういう処理を config.ph にかいてください。

$START_HOOK = q#
	$SKIP{'fukachan@phys.titech.ac.jp'} = 1
		if &AddressMatch($From_address, 'fukachan@phys.titech.ac.jp');
#;

こうすると fukachan@phys.titech.ac.jp あてのメールは skip します。
↑ここは actives とかに現れるものと同じにして下さい。

複数あるなら 全部を うえのフックに加えて下さい。


8.2	off と skip

fml-support: 07144

off はメンバ用
skip は管理者だけが使えるように

Count: 07122 で話題にあったように、エラー対策 (を兼ねたお知らせメイルな
んですが) として on off matome のメンバには定期的に個別にメイルを送って
ます。(skip の場合には送らないようにしている)


8.3	登録時の welcome メールが送り返されるのを止める

* fml 3.0 シリーズ

libamctl.pl というファイル( 例: /usr/local/fml/libamctl.pl )に sub
AutoRegist ではじまる関数があって、その最後の方に

   &SendFile($from, $WELCOME_STATEMENT, $WELCOME_FILE);

というところがあります。ここを除いてもらうと絶対 welcome は送られませ
ん。次のような HOOK が 3.0 シリーズにはないので、トリッキーな回避の仕
方はないです。


* fml 4.0
fml 4.0 では、非常にトリッキーなやりかたでよくありませんが、

$AUTO_REGISTRATION_HOOK = q#
        sub SendFile {};
#;

という HOOK を書くと、welcome がおくられなくなります。

8.4	登録/削除以外は限りなく不必要

fml-support: 07271

条件1. 登録者に一切報告メール(welcome も)は送らない
条件2. 登録した、退会した、旨のメールのみ送る
条件3. よってコマンドは subscribe と bye 以外不要だろう
この3つの条件を実現するのは結構面倒です。

◯ welcome を送らない方法は前レシピも参照して下さい。

◯ 例えば、特定のコマンド( subscribe confirm bye )だけを許すには、次の
ようにします。これら3つがあれば登録削除だけができるはずです。

@PermitProcedure = ('subscribe', 'confirm', 'bye');

◯ 多くのコマンドは処理を終えるとリクエストを送ってきたユーザへ返事を
   返しますがそれを抑制するには

     &DEFINE_MODE('disablenotify');

をつかうこともできます。が、あまりにも抑制し過ぎてしまうので
かなり考え物です…


8.5	メーリングリストへの初投稿に至る手数をなるべく少なくしたい

fml-support: 07521 より

Q: メーリングリストへの初投稿に至る手数をなるべく少なくしたい

   A) メンバ以外のアドレスからML名@xxxxxxxxxx ($MAIL_LIST)
      へ投稿した場合は、
	[1] members ファイルに自動登録する。
	[2] 投稿されたメールをmembersに配送する。

	これだけですとメーリングリストへ参加するために何か投稿しなくて
	はならないので、コマンド用のアドレスでは登録のみを行うようにす
	る。即ち、

   B) メンバ以外のアドレスからML名-ctl@xxxxxxxxxx ($CONTROL_ADDRESS)
   へメールを送信した場合は、

	[1] membersに自動登録する。

A: config.ph でちょっと tricky だが 

    $AUTO_REGISTRATION_LINES_LIMIT = -1;
    $START_HOOK = q#
    	if ($Envelope{'mode:ctladdr'}) {
    		$AUTO_REGISTERED_UNDELIVER_P   = 1;
    	}
    	else {
    		$AUTO_REGISTERED_UNDELIVER_P   = 0;
    	}
    #;

のような設定をする。


8.6	skip コマンドの操作対象のファイルは?

fml-support: 07656, 07716

◯ list1 ,list2 というメーリングリストがあり、list1 の config.ph で
	push( @MEMBER_LIST, "$DIR/../list2/members" );
として list1,list2 は 包含関係にある。

◯ list1,list2 両方に 同じアドレスを登録してある人がいる。

どちらのMLのアドレスを操作しようとするか?

@MEMBER_LIST 配列の順にさがしていってそのアドレスが最初に見つかったファ
イルに対して操作を行ないます。

これは config.ph で定義した値は

  loading config.ph
  @MEMBER_LIST を再設定
  ...

の順で初期化をしているために list2 list1 の順でさがして list2 でみつかっ
て list2 のほうにそうさをしようとしてしまいます。

2.2A でなんとかするなら

$START_HOOK = q#
   push( @MEMBER_LIST, "$DIR/../list2/members" );
#;


8.7	メーリングリストに参加可能なユーザのドメインを絞る

自動登録やリモートでの登録の際の制限については 
$REGISTRATION_ACCEPT_ADDR という変数で制限できます。
4.3../remote_control 4.14
4.3../remote_control 4.14

直接そういう変数があるわけじゃないですが、特殊な処理をするために HOOK 
がいっぱいあります。ありうる可能性をすべて変数にしてるといくらあっても
追いつかないので

$START_HOOK = q#
   if ($From_address !~ /permit_domain\.co\.jp$/i) {
	&Mesg(*Envelope, 
	   "We permit user@*permit_domain.co.jp can join this list.");
	$DO_NOTHING = 1;
   }
#;

とかすれば、permit_domain.co.jp 以外のユーザには「permit_domainのゆー
ざだけしか参加できないよん」とメールが返って終りにできます。
$DO_NOTHING = 1 にすれば配送、自動登録などほとんど全ての処理が行なわれ
ません。これら全ての場合に共通の設定として利用できます。

	$DO_NOTHING = 1		メインの処理をしない
				配送、自動登録などほとんど全ての処理が
				行なわれないことになる

で、メインを呼ばなければ自動登録ルーチンも動きません。

   if ($From_address !~ /permit_domain\.co\.jp$/i) {

が From: が permit_domain 以外のユーザの表現です。後例えば

   if ($Envelope{'h:sender:'} !~ /permit_domain\.co\.jp/i) {

なら Sender: が permit_domain.co.jp 以外の人は参加できないことになりま
す。(が Sender: なんて From: == Sender: なら普通つけないからよくない例
だな)。


8.8	『自動登録』かつ『ポストできる人を制限する』設定例その2
4.4

$REJECT_COMMAND_HANDLER には特殊な auto_asymmetric_regist という値があ
ります。これは配送と認証のリストを非対称に使う時に使います。
4.4
4.4

これは別の考え方です。elena と elena-regist という2つのMLを作る。

	elena		投稿専用(手動登録)
	elena-regist	コマンド専用(自動登録に設定しておく)

アドレスを書くファイル

	elena-regist/members	MLの配送のリスト(自動登録)
	elena/members		MLの認証に使うリスト(手動登録)
				(MLに投稿できる人のリスト)

という2つのMLを作り設定する。登録用に elena-registを作り elena/cf 
の ACTIVE_LIST を /var/spool/ml/elena-regist/members にする。

   [作業の流れ]

	% makefml newml elena
	% makefml newml elena-regist
	% cd /var/spool/ml/elena-regist
	% cp include-ctl include

	*** /etc/aliases を適宜設定する

	% cd /var/spool/ml/elena
	% makefml edit elena cf

	*** edit cf ふぁいる (ACTIVE_LISTを設定する)
	elena/cf に

	ACTIVE_LIST	/var/spool/ml/elena-regist/members

	を加え config.ph を再生成する。

	% make config.ph
	% makefml add elena postable-member-address-1
	% makefml add elena postable-member-address-2
	.....

[Discussion]
elena が elena-regist/members を open する時に elena-regist をロックし
てない。が、大丈夫だらう:)


8.9	認証する際のドメインのALIAS %DOMAIN_ALIASES

認証する時には ujauja.or.jp  => ujauja.ne.jp に書き換えてTRYしてみる

%DOMAIN_ALIASES = (
	'ujauja.or.jp', 'ujauja.ne.jp',
	);

# fml.pl 2.0.24.47 へのパッチの例

--- fml.pl.org	Fri Nov 21 08:11:10 1997
+++ fml.pl	Sat Nov 22 12:51:33 1997
@@ -571,6 +571,19 @@
     &Log("Gecos [$e{'macro:x'}]") if $debug;
     $e{'Addr2Reply:'}    = &Conv2mailbox($e{'h:reply-to:'},*e)||$From_address;

+    if (%DOMAIN_ALIASES) {
+       local($addr);
+	if (&MailListMemberP($From_address)) {
+	    ; # not rewrite
+	}
+	else {
+	    for (keys %DOMAIN_ALIASES) {
+		if ($From_address =~ /$_$/i) {
+                   $addr = $From_address;
+		    $addr =~ s/$_$/$DOMAIN_ALIASES{$_}/i;
+                   &MailListMemberP($addr) && ($From_address = $addr);
+		}
+	    }
+	}
+    }
+
     # To: $MAIL_LIST for readability;
     # &RewriteField(*e, 'Cc') unless $NOT_REWRITE_CC;
     if ($REWRITE_TO < 0) { 


8.10	メンバーチェックの際のアドレスのチェックの厳しさ

アドレスのチェックを緩めたりきつくしたりしたい場合は
../address_manipulate 3.1


8.11	$MAINTAINER というアドレス

MLの管理者のアドレスです。エラ−メ−ルの帰る場所もこのアドレスです。
$MAINTAINER と $MAIL_LIST が同じになっているとエラーメールがMLに返っ
てきて無限ループします。

インターネットでは歴史的に listname (MLの名前) に対して
『listname-request は管理者のアドレス』であることが多いです(絶対ではあ
りません)。ちょっと request というのが直感に反するところもありますが…
いつも僕はこの事実との整合性とわかりやすさのために

	listname-admin 		管理者のアドレス
	listname-request 	listname-adminへフォワード

のように設定しています。そのためどちらのアドレスへ送られても管理者へそ
のメールは届くわけです。makefml のデフォールトは listname-admin です。
プロバイダではそれぞれの設定があったりするので注意して下さい。


8.12	アドレスを組織ごとに管理したい

	A社	a.list
	B社	b.list
	C社	c.list

各社では自社のメンバーリストを管理する

A: config.ph に

	@MEMBER_LIST = (
			"$DIR/a.list",
			"$DIR/b.list",
			"$DIR/c.list",
			);
	@ACTIVE_LIST = (
			"$DIR/a.list",
			"$DIR/b.list",
			"$DIR/c.list",
			);

8.13	意見受付用アドレス?

意見受付用アドレスをMLでうけて、送ってきた人に「ご意見ありがとうござい
ました。返事はしばらく待ってね。」と自動で応答させる。

改造:
そのために投稿は誰でもOK。ただし、メンバー以外からの投稿はMLに流し、か
つ投稿者にguideファイルを返す(自動登録はしない)。

config.phの設定例 1:

### sample configuration ###
$PERMIT_POST_FROM              = "anyone";

# YOU CAN EDIT MANUALLY AFTER HERE.
$START_HOOK = q# 
   if (! &MailListMemberP($From_address)) { &GuideRequest(*Envelope);} 
#;


From: $MAIL_LIST
Subject: Thanks you for your mail


### sample configuration ###
$PERMIT_POST_FROM              = "anyone";


# YOU CAN EDIT MANUALLY AFTER HERE.
$RECRUIT_ACK_STATEMENT = "Thanks you for your mail";
$RECRUIT_ACK_FILE      = "$DIR/recruit_reply";

$START_HOOK = q#
    if (! &MailListMemberP($From_address)) {
	&DEFINE_FIELD_OF_REPORT_MAIL('From', $MAIL_LIST);
        &SendFile($From_address, $RECRUIT_ACK_STATEMENT, $RECRUIT_ACK_FILE);
    }
#;


8.14	複数アドレスから投稿したいがうけとりは一つ( "skip" コマンド)


8.15	ML-request をコマンド用のアドレスにする

1 	-request 宛をコマンドにするためには、-request 宛が fml.pl を
     	呼ぶようにしなければなりません。つまり /etc/aliases を変更し
	listname-request がコマンド用の include-ctl を呼ぶようにしていないと
	いけません。例: elena ML の場合

	elena-request: :include:/var/spool/ml/elena/include-ctl

   ファイル include-ctl は

	"|/usr/local/fml/fml.pl /var/spool/ml/elena --ctladdr"

のようになっている必要があります。

2 	また配送するメールのヘッダではコマンドの送り先情報を
	書いています。ユーザの便宜のためアドレスも変えて下さい。
	config.ph  なら

	$CONTROL_ADDRESS       = "elena-request\@$DOMAINNAME";

と登録する必要があります。問題はこの場合 $MAINTAINER をどうするかです。-
request のままだとエラーの時恐いので、 elena-admin 等をつくってそれは
本当の単なる管理者宛のフォワード等にするとよいとおもいます。ちなみにデ
フォールトは elena-admin なのでそのままで大丈夫でしょう。


$Id$