	その他(うまく分類できなかった)いくつかのこと

------------------------------------------------------------
I	いろいろ

1	いろいろ
1.1	fmlのコマンドが送れるページの例
1.2	意見受付用アドレス？
1.3	配送するメールのMIME部分はDecodeしてしまいたい
1.4	confirm の確認メッセージを MAINTAINER へ転送する

2	ロックについて
2.1	ロックアルゴリズムの選択
2.2	ロックで変になっている時にlockfileを全部消してもいいですか？

3	spool 
3.1	spool は何を保存してるの？
3.1	fml に入力されたものを spool/ に保存できますか？
3.2	スプールに記事をためない
3.3	ＭＬのスプールの read permission
3.4	スプールにあるファイルをMIME逆変換する
3.5	mget でえた spool の下のファイルを mh 以外で読む時

4	その他
4.1	本当に残しておく必要のあるファイルは？
4.2	特定の一つのＭＬだけを一時停止したい(削除にあらず)
4.3	毎日記事番号がリセットされるＭＬ

5	ひっこし
5.1	NT の引越し時 (pop version)

6	summary ファイル
6.1	summary file format を変更する

7	Subject はっく
7.1	すれっどの先頭にだけ番号をふる？

II	レンタルサーバというかISPのサービスというか…

III	examples

8	examples
8.1	site*ph sample (mnews ML)
------------------------------------------------------------


I	いろいろ

1	いろいろ

1.1	fmlのコマンドが送れるページの例
	http://www.infosite.ne.jp/fml/

    in fml-support: Count: 01585
    From: Yuao Tanigawa <yuao@infonia.or.jp>
    >   fmlのコマンドが送れるページを作ってみました。URLは
    
    …

1.2	意見受付用アドレス？

意見受付用アドレスを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);} 
    #;

config.ph 設定例 2:
guide ではなくguideとは別に用意したファイルを返す。
ヘッダもカスタマイズ

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

1.3	配送するメールのMIME部分はDecodeしてしまいたい
See also: Japanese 2 

では、配送するメールのMIME部分はDecodeしてしまいたい時はどうするか？
例えば、fml.pl の sub GetFieldsFromHeaderで

    if ($USE_LIBMIME && ($MailHeaders =~ /ISO\-2022\-JP/o)) {
        require 'libMIME.pl';
	$Summary_Subject = &DecodeMimeStrings($Summary_Subject);
    }

を

    if ($USE_LIBMIME && ($MailHeaders =~ /ISO\-2022\-JP/o)) {
        require 'libMIME.pl';
	$Summary_Subject = &DecodeMimeStrings($Summary_Subject);
	$MailBody = &DecodeMimeStrings($MailBody);
    }

で本文の任意の ISO-2022-JP で始まる部分だけをMIME decodeします

1.4	confirm の確認メッセージを MAINTAINER へ転送する

fml-support: 08960

Q: fml の自動登録のモードで confirmation をしているとします。この時、
confirm の確認メッセージは投稿者に対して返信されます。これを、管理者宛
に送信し、管理者が返信することにより登録が完了するような形にするにはど
うすれば良いでしょうか？

Q: 管理者宛に転送されるメール

  例(メール本文):

	confirm 200010302002481472410938048 Tomoyo Daidouji

を横取りして、管理者がこのメールへの返答を elena-ctl へ送ってあげると
いうことでいいんでしょうか？確かにそういうことはできないんですけど、
HOOK をつかえば横取りができます :-) そのメールに返事をすればOK 

    $FML_EXIT_HOOK = q#
       if (! &MailListMemberP($From_address)) {
            $Envelope{'message:h:to'} = $MAINTAINER;
       }
    #;

2	ロックについて

2.1	ロックアルゴリズムの選択
See also: internals 6.9 

FML uses flock(2) in default. If you use flock(2), set

	$USE_FLOCK    = 1; (default 1)

を設定すると flock system call をロックに使います。

	$USE_FLOCK    = 0;

とすると link(2) を使うやり方にセットできます。デフォールトはflockです。

2.2	ロックで変になっている時にlockfileを全部消してもいいですか？

多くの(古そうな)ファイルは消してもいいですが、走ってるプロセスに関係し
てるのだけは避けた方がいいです。その時は rm -f var/run/lockfile.v7 (た
ぶん日付があきらかかに一時間以上古いはず)っていうファイルだけ消してみ
るのが良いです。
3	spool 

3.1	spool は何を保存してるの？

配送された記事です。get などの取り寄せ時に同じものが返るように、配送さ
れたものと同じものを保存しています。
fml に入力されたものとは違います。

3.1	fml に入力されたものを spool/ に保存できますか？

そういうオプションはありません。

expire してもいいなら $USE_LOG_MAIL を on にすると入力(のメール)を 
var/Mail/ の下に貯めていけます。

もし spool.orig とかに元記事をずっと貯めておきたいなら、こんなかんじですか
ね。注意： $ID は $START_HOOK ではまだ決まっていないので、この最後の HOOK を利用しています。

$FML_EXIT_HOOK = q#
	my ($f) = "$SPOOL_DIR.orig/$ID";
	-d "$SPOOL_DIR.orig" || mkdir("$SPOOL_DIR.orig", 0700);
	if (open($f, "> $f)) {
		print $f $Envelope{'Header'}."\n".$Envelope{'Body'};
		close($f);
	}
#;

3.2	スプールに記事をためない

DISKが足りない等で記事をためずに配送するだけにしたいなら

	$NOT_USE_SPOOL = 1;

と設定してください。もちろんその場合は古い記事の取り寄せ等ができません
(当たり前)。

3.3	ＭＬのスプールの read permission

通常ＭＬ管理者の権限で fml は走っています。そしてＭＬの全てのファイル
は管理者以外の人が見れない様になっています。

例外としてメーリングリストの directory でも htdocs だけはすべての人が
読めるようになっています。これは httpd がどのユーザ権限で走っているか
わからないためです(通常 nobodyとかで走っている)。

セキュリティについては internals 9

3.4	スプールにあるファイルをMIME逆変換する

lib/MIME/rmime を使って、/bin/sh なら

	for file in *
	do
	   mv   $file     $file.org
	   perl rmime $file.org > $file
	done

くらいでＯＫでしょう
＃とりあえず .org つきのをバックアップに残すコードつき:-)

nkf -m でもいいだろう

3.5	mget でえた spool の下のファイルを mh 以外で読む時

lib/Utilities/packmbox.pl を使って、

	(cd spool; packmbox.pl ) > ~/mbox

として、mbox をつくれば、これにたいして、/bin/Mail なり Rmail なりを使
うことができて便利でしょう。

4	その他

4.1	本当に残しておく必要のあるファイルは？

たまにどこが必要な部分ですか？と聞かれますが、makefml install を使えば
core の部分だけが概ねインストールされます。

makefml でインストールすると document 群も入れます。documents は大きい
です。インストール先の doc の下にまとまってるので、ここは消して構いま
せん。ドキュメントは「www.fml.org を見るから doc/html は要ら
ないから消す」という選択はありうるでしょう。ただ www では常に最新版の
内容だけが見られるという点に注意してください。ISPのシェルを使ってる場
合などならISP側ではなく自分の端末のローカルディスクに移しておくとゆう
手もあります。

それ以外に何を消していいかは機能をどこまで使うかに依存しているので一概
にはいえません。が document 以外で概ね 1M くらいです。ちなみに

	doc 	ドキュメント
	libexec 特殊なもの fml_local とかも含む
		fmlserv があるから消しちゃ駄目かもしれない
	bin 	fml 自体は使わない user 支援 program 群

etc, sbin, cf は消しちゃダメです。

余談ですがFML.ORGのＭＬで調べるとだいたいMLのホームは 1000通 〜 4M く
らい必要と評価しておくといいみたいです。

4.2	特定の一つのＭＬだけを一時停止したい(削除にあらず)

配送を止めるだけならデバッグモードにするとやみに葬られます:)

/etc/aliases を編集し、事実上無効にするというのもよいでしょう。

    elena: elena-admin
    elena-ctl: elena-admin
    elena-admin: fml

4.3	毎日記事番号がリセットされるＭＬ

一日の記事の投稿数が一目でも分かるように夜中の１２時を境に
記事番号を０に戻す、つまり

	Subject: [elena 00100]

を

	Subject: [elena 00000]

にするわけです。

記事番号は多くのファイルに関係しています。
seq は記事番号のカウンタだし、log や summary には記事ごとの
データが記録されています。
spool と seq は整合性チェックをしているので、spool も変えてしまわないと
記事が重複しているというエラーが発生します。
これらの関係あるファイルを全部名前を変えてしまうしかありません。
パート II のテストの項目でＭＬをリセットする話をしましたが、
それと原理的には同じです。

次のような shell script でもつくって cron ( .ref{cron} 節参照) 
で毎晩回してみるとできるとおもいます。
    #!/bin/sh
    
    ml=elena
    
    date=`date -u +%C%y%m%d`
    
    /usr/local/fml/makefml lock $ml 60 &
    
    cd /var/spool/ml/$ml || exit 1
    
    for file in seq spool summary log
    do
       if [ -f $file ];then
            mv $file $file.$date
       fi
    done

5	ひっこし

5.1	NT の引越し時 (pop version)

Q: NT4 にPOP版fmlを入れてMLを運用しています。
   POP、SMTPサーバのアドレスが変更された時にはどこを変更しますか？

	C:\fml\_fml\pop

というファイルに POPサーバ SMTPサーバの名前が書き込まれています。それ
を編集して下さい。

6	summary ファイル

6.1	summary file format を変更する

98/09/10 10:19:28 [1:hoge-admin] テスト
98/09/10 16:52:23 [2:hoge@hoge.hoge] おめでとう

を

98/09/10 10:19:28 [1] テスト
98/09/10 16:52:23 [2] おめでとう

のようにアドレスを記載しないようにしたい場合、次のような HOOK をつかい、
フォーマットをコントロールできる。これを簡単にやる方法はない。

    $DISTRIBUTE_SUMMARY_HOOK = q#
     	&Append2(sprintf("%s [%d:%s] %s", 
     			 $Now, $ID, substr($MAINTAINER, 0, 15), $s),
     		 $SUMMARY_FILE);
    #;

7	Subject はっく

7.1	すれっどの先頭にだけ番号をふる？

fml-support: 07772 近辺

Q: スレッドの先頭の記事にだけ Subject: に通し番号を振り、返信メールに
   関しては Subject: はいじらない

A: とても面倒のようです。

   1通目: Subject: [ML:1] 元の件名
   2通目: Subject: Re: [ML:1] 元の件名
   3通目: Subject: Re: [ML:1] 元の件名
   4通目: Subject: [ML:4] 別の件名
   5通目: Subject: Re: [ML:4] 別の件名

なら次の HOOK でいけます。

   $SMTP_OPEN_HOOK = q#
       if ($Envelope{'h:subject:'}  =~ /^\s*Re:/i) {
           $Envelope{'h:Subject:'} = $Envelope{'h:subject:'};
   	undef $SUBJECT_FREE_FORM;
       }
   #;

しかし、4 通目は [ML:2] とカウントしてほしいなら、
いわゆる記事番号とは別にカウントするしかありません。
例えば別の sequence ファイルをつくってカウントをしていきます。

       $SMTP_OPEN_HOOK = q`
           undef $SUBJECT_FREE_FORM;
           if ($Envelope{'h:subject:'}  =~ /^\s*Re:/i) {
               $Envelope{'h:Subject:'} = $Envelope{'h:subject:'};
           } else {
               $SEQ_SUBJ_FILE = "$DIR/seqsubj";
               &Touch($SEQ_SUBJ_FILE) unless -f $SEQ_SUBJ_FILE;
               $IDSUBJ = &GetFirstLineFromFile($SEQ_SUBJ_FILE);
               $IDSUBJ++;
               &Write2($IDSUBJ, $SEQ_SUBJ_FILE);
               #&Log("IDSUBJ=[$IDSUBJ]");
               $Envelope{'h:Subject:'} =~ s/^\s+//;
               $Envelope{'h:Subject:'} = "[$BRACKET:$IDSUBJ] $Envelope{'h:Subject:'}";
           }
       `;
    
    注: この例でも動きますが、エラーチェックは不十分といえます。
    
II	レンタルサーバというかISPのサービスというか…

III	examples
8	examples

8.1	site*ph sample (mnews ML)

    # コマンドメールの返送に付くフッタのフェースマーク
    $FACE_MARK     = '(^_^)/~';
    
    # たとえ空メールでも配布する
    $AUTO_REGISTRATION_LINES_LIMIT = -1;
    
    # ヘッダの「X-何たら: 」を素通しにする
    $SUPERFLUOUS_HEADERS = 1;	# preserve more header fields
    
    # MIME に対応する
    $USE_LIBMIME   = 1;		# when use MIME Extension in libMIME.pl
    
    # spool に MIME デコードしてから書き込む
    $MIME_DECODED_ARTICLE = 1;	# do MIME decoding, then spool
    
    # コマンドメールであるかどうかを確認する行数
    $COMMAND_CHECK_LIMIT = 1;	# the first 3 lines is checked for
     				# mistakes whether the command mode or not?
     				# at &Parsing in fml.pl, 
    
    # コマンドで単なるシンタックスエラーの警告
    $USE_WARNING = 1;		# コマンドで単なるシンタックスエラーの警告
    
    # まとめ送りのとき mh/burst 用にする
    $USE_RFC934    = 1;		# inMatomeokuri, use mh/burst for the split
    
    # パス名を変更(更新のとき =* をコピーすれば良い)
    $OBJECTIVE_FILE = "$DIR/=objective"; 	# objective file
    $GUIDE_FILE    = "$DIR/=guide";		# the guide file of our Mailing List 
    $HELP_FILE     = "$DIR/=help";		# the help file for useful commands
    $DENY_FILE     = "$DIR/=deny";		# attention to illegal access
    $FAIL_FILE     = "$DIR/=fail";		# attention to illegal access
    $WELCOME_FILE  = "$DIR/=welcome";	# could be "$DIR/welcome"
    
    # 気分的に log とは分離した
    $MGET_LOGFILE  = "$DIR/log_mget";	# log file for mget routine
    
    # ちょっとした変更(特に効果はない)
    $Subject       = '(No Subject in original)';	# Subject field
    
    # SMTP コネクションを張って HELO のときに localhost と名乗る
    $Envelope{'macro:s'} = 'localhost';
    
    # 配送レベルを bulk にする
    $PRECEDENCE     = 'bulk';
    
    # ローテーションするログの指定
    @NEWSYSLOG_FILES = ("$MSEND_RC.bak", "$MEMBER_LIST.bak", "$ACTIVE_LIST.bak",
                        "${LOGFILE}_archive", "${LOGFILE}_matome");
    
    # スキップする「X-何たら: 」フィールド
    $SKIP_FIELDS = '|X-Nsubject|X-Confirm-Reading-To';
    
    # スタートフック
    $START_HOOK = q#
         # コントロールメールアドレスか?
        if ($CONTROL_ADDRESS && ($Envelope{'mode:chk'} =~ /$CONTROL_ADDRESS/i)) {
             # 新規登録か?
            if ($Envelope{'Body'} =~ /subscribe/io
                  && $Envelope{'Body'} !~ /unsubscribe/io) {
                &use('utils');
                &AutoRegist(*Envelope);
                $DO_NOTHING = 1;
            }
            $Envelope{'mode:uip'} = 'on'
         # コマンドモードか?
         # (この ML では本体の方でコマンドメールを受け付けていないため)
        } elsif ($Envelope{'mode:uip'}) {
            &Logging("Unsupport Command Mail");
            &SendFile($From_address, 
                      "Unsupport Command Mail this Address $ML_FN", $FAIL_FILE);
            $DO_NOTHING = 1;
         # 普通に配送する
        } else {
            &Distribute;
            $DO_NOTHING = 1;
        }
    #;
    
    # SMTP 開始時のフック
    $SMTP_OPEN_HOOK = q#
         # 元メールの To: フィールドを保存
        $Envelope{'h:To:'}       = $Envelope{'h:to:'}
              || $Envelope{'h:apparently-to:'} || "$MAIL_LIST $ML_FN";
         # Reply-To: を強制的に書き換える
        $Envelope{'h:Reply-To:'} = $Envelope{'h:reply-to:'} = $MAIL_LIST;
         # MIME なら Subject: をデコードする
        if ($USE_LIBMIME && $Envelope{'MIME'}) {
            &use('MIME');
            $Envelope{'h:Subject:'} = &DecodeMimeStrings($Envelope{'h:Subject:'});
        }
    #;
    
    # ヘッダに追加するフック
    $HEADER_ADD_HOOK = q#
         # X-Nsubject: フィールドの処理
         # (この ML では X-Nsubject: も Subject: と同じ処理を受ける)
        if ($Envelope{'x-nsubject:'}) {
            if ($STRIP_BRACKETS) {
                $_ = $Envelope{'x-nsubject:'};
                local($r)  = 10;
    
                s/\[$BRACKET:\d+\]\s*//g;
    
                while (s/Re:\s*Re:\s*/Re: /gi && $r-- > 0) { ;}
    
                $Envelope{'x-nsubject:'} = $_;
            }
            if ($USE_LIBMIME && $Envelope{'MIME'}) {
                &use('MIME');
                $Envelope{'x-nsubject:'} =
                      &DecodeMimeStrings($Envelope{'x-nsubject:'});
            }
            $body .= "X-Nsubject: [$BRACKET:$ID] $Envelope{'x-nsubject:'}\n";
        }
    #;
    
    # libtraffic のフック(試験的設定)
    $TRF_NAME_HOOK = q#
        $name =~ s/umura@solan\.chu/umura@nn.solan./oi;
    #;


		INDEX

packmbox.pl                                ...   3.5 
$USE_FLOCK                                 ...   2.1 
スプールにあるファイルをMIME逆変換         ...   3.4 
スプールに記事をためない                   ...   3.2 
