		エラーメールに対する取り扱い

------------------------------------------------------------
1	概要
1.1	エラーメール
1.2	エラーメールの送られる先は？
1.3	エラーになるアドレスの自動削除
1.4	ＭＬ側から定期的に『入り続けるか？』を確認する
1.5	ループを防ぐ
1.6	Errors-To:

2	MEAD (Mail Error Analyze Daemon)
2.1	Introduction
2.2	動作
2.3	ファイルについて
2.4	理論
2.5	セットアップ
2.6	設定ファイル
2.7	mead.pl コマンドラインオプション
2.8	問題点
2.9	A few tips
2.10	VERPs (Variable Envelope Return Paths)

3	qmail の VERPs での自動エラー処理のしかた

4	Mail Loops
4.1	Message-ID: Cache
4.2	一意なX-ML-Info: 

5	Confirmation Daemon (libexec/confirmd.pl)
5.1	『反論なき場合は削除に同意』デーモン?:-)
5.2	設定の仕方
5.3	時間の変数
5.4	ファイル
------------------------------------------------------------


1	概要

エラーメールの事例については「トラブル対策」( 
section)の方をみてください。

1.1	エラーメール

エラーメールは通常 $MAINTAINER に返ってきます。
elena MLなら elena-admin@あなたのドメイン です。

MTAから返ってくるメールはエラーの分析とデバッグの大事な情報です。
ほとんどは典型的なフレーズでしかないので英語だからと嫌わず
エラーをしらせるキーワードを探してみてください。

典型的な例 => troubleshoot 6

メールがループするのもエラーです。=> 4

1.2	エラーメールの送られる先は？

elena ML の場合 elena-admin です。

"makefml newml"の時に作る見本で

	elena-admin: そのmakefmlを走らせたユーザ

になっています。例:

	elena-admin: fml

fml@あなたのドメイン のメールを読む人にいきます。設定によっては単にメー
ルスプール /var/mail/fml にたまっているだけかもしれません

この送り先を変えるには

1. 単に /etc/aliases をいじる

	elena-admin: ユーザ１@どっかのドメイン, ユーザ2@どっかのドメイン2

2. いちいち root になりたくない

	elena-admin: :include:/var/spool/ml/elena/include-admin

/var/spool/ml/elena/include-admin は一行一アドレス

	ユーザ１@どっかのドメイン
	ユーザ2@どっかのドメイン2

[注意]
	/var/spool/ml/elena/include-admin は chmod 644 してください

1.3	エラーになるアドレスの自動削除

/etc/aliases を編集して mead (Mail Error Analyze Daemon) を有効にして
下さい。詳細は 2

elena ML の例:

	elena-admin: fukachan

	# MEAD; If you use mead.pl, 
	#elena-admin: fukachan, :include:/var/spool/ml/elena/include-mead

を 

	# elena-admin: fukachan

	# MEAD; If you use mead.pl, 
	elena-admin: fukachan, :include:/var/spool/ml/elena/include-mead

のように入れ換えます。/var/spool/ml/elena/include-mead は mead.pl を起
動するように最初から設定されています。

1.4	ＭＬ側から定期的に『入り続けるか？』を確認する
See also: 5 

抜けなきゃいけないけれど連絡をし忘れているなどよくある話です。confirmd 
というデーモンは定期的(例: 2カ月の一度)にメンバーに「これからもＭＬに
入り続けるか？」を尋ね、返事がなければ参加の意志がないものとして、その
メンバーを削除するプログラムです。

1.5	ループを防ぐ
See also: 4 

fml は入力されるメールをチェックしています。その項目は以下のようなものです。
一定期間内にくるメールが

1. 同じ Message-ID: をもたない

	同じMessage-ID:のメールはありえない。同じIDのものがきたら拒否する。

2. あきらかに自分のＭＬの X-ML-Info: をもったメールはおかしい

   X-ML-Info: フィールドにはＭＬのアドレス(MLのアドレス、コマンドのア
   ドレス、管理者のアドレスのいづれか)が出てきます。例え多段のＭＬ(例
   えば ML-A -> ML-B -> ML-C -> ... のML-B)であってもX-ML-Info: に自分
   のＭＬアドレス(X-ML-Info: ML-B)はでないはずという仮定です。

ここまではデフォールトです。オプションで

3. メール本文の MD5 checksum 

というチェックができます。つまり同じ内容のメールが来たらそれはループに
ちがいありません。

もっとも「 test 」と一行だけのメールが送れなくなりますが、いいですよね:-)

1.6	Errors-To:

Errors-To: は使わないと10年くらい前に決められたにもかかわらず、今でも
使われています。それも太古のサービスが生き残っているわけではなく、新規
のサービスなどで間違って使われています。

2	MEAD (Mail Error Analyze Daemon)

[概要]
この章は「エラーメールを解析して、メールが届かないメンバーのアドレスを
自動的にＭＬから削除する」方法についてです。
ＭＬ作成時に見本は作られているので/etc/aliasesに一行足せば動きます。カ
スタマイズはコマンドラインオプションで行ないます。perlで書いたHOOKなど
は設定ファイルを使って読み込ませることができます。
設定 		=> 2.5
設定ファイル	=> 2.6
オプション	=> 2.7

まだβテストなので時時間違うかもしれませんのでよろしく〜

2.1	Introduction

エラーメールは普通 $MAINTAINER に帰ってきます。

Example:
     From:    Mail Delivery Subsystem <MAILER-DAEMON@DOMAIN.OR.JP>
     Subject: Returned mail: User unknown
     To:      xxx-admin@shumi.fml.org
     Date:    Sun, 21 Jun 1998 16:17:22 +0900 (JST)
    
     ... while talking to mail.domain.or.jp.:
     >>> RCPT To:<xyz@ar.domain.or.jp>
     <<< 553 <xyz@ar.domain.or.jp>... User Unknown
     550 xyz@ar.domain.or.jp... User unknown
    ~.q
    
    特に年度末などの切替わり時期には連絡もなく勝手にいなくなるユーザが多数
    いるので、このようなメールを無数にうけとります。そして管理者が削除しな
    ければなりません。そのためＭＬ管理者は自動的に削除したいとおもうもので
    す。
    
    帰ってくるメールはデフォールトではMLを作成したユーザへフォワードされる
    ように設定されています(aliasesファイルを参照)。この user unknown など
    の情報を集めて『Ｎ回(デフォールトは5回)エラーが帰ってきたらそのユーザ
    を削除する』ようにすれば自動的に存在しないユーザをＭＬから削除すること
    ができます。そのためのプログラムが mead.pl (libexec/mead.pl) です。
    
    便利ですが、設定の手違などあると困るので設定はくれぐれも慎重に。
    
2.2	動作

◯ デフォルト

shell script をつくります。自動削除はしてません

◯ エラーと判断されるのはどういう時か？

実際のところ流量に依存しています。過去 14 日間で、アドレスごとに

	理由			得点
	ーーーーーーーーーーーーーーーー
	user unknown なら   + 1    点
	それいがいは        + 0.25 点

で合計をとって、これが 5 点をこえたら削除対象にします。
＃ メールサーバの設定を間違った瞬間にＭＬで一気に記事がながれて
＃ user unknown が大量発生すると削除されたりしますね  ;D
＃ でも、よっぽど凄いＭＬでない限りそういう間違い
＃ 消去は少なくなるようなぱらめーたのつもり

XXX 今一つ良いアルゴリズムでない気もするし、
XXX といって代わりのよいアルゴリズムはどういうのがいいかね

2.3	ファイルについて

current の mead.pl にはそれ以外のファイルがあります :-)
errormaillog はキャッシュとして、使っています。その辺は一緒ですが、
それに付け加えて「このあどれすを削除するぞ」と決めたアドレスを

	/var/spool/ml/mead/dead_addrs	( mead 専用の作業場所 )
とか
	/var/spool/ml/elena/dead_addrs	( elena MLのエラーを解析する mead )

というファイルに記録しています。一行一アドレスです。

あと、判断できなかったけど、たぶんエラーだと疑われるアドレスを
 error_addr.hints に吐きます。smtpfeed -F オプションをつかったエラー追
跡結果などが、このファイルに記録されるはずです。

2.4	理論

帰ってきたエラーメールが mead.pl に入力として渡される。5XX のような行
からエラーになるアドレスをわりだし、キャッシュします。5(がデフォールト)
回エラーが来たら
	『そのアドレスを削除すべきことをしらせる』(デフォールト)
か
	『makefmlを呼び出して自動的に削除する』
ことをします。

2.2A以降(2.2.1, 2.2A)では、各MTA依存のフレーズの解析やDSN(Delivery
Status Notification)も見ています。

2.5	セットアップ

パラメータをいじらないなら/etc/aliasesの変更だけです。

ＭＬ作成時(makefml newml を実行した時)に

	include-mead

が作られています。また生成される見本の aliases ファイルには mead を使
う設定がコメントアウトされた状態で入っています。meadを設定するためには
/etc/aliasesにその該当する行のコメントをはずしたものをつけ足します。

elena ML の例:

	elena-admin: fukachan

	# MEAD; If you use mead.pl, 
	#elena-admin: fukachan, :include:/var/spool/ml/elena/include-mead

を 

	# elena-admin: fukachan

	# MEAD; If you use mead.pl, 
	elena-admin: fukachan, :include:/var/spool/ml/elena/include-mead

のように入れ換えます。/var/spool/ml/elena/include-mead は mead.pl を起
動するように最初から設定されています。

2.6	設定ファイル

コマンドラインの -f config-file オプションで設定ファイル(perl script)
を指定できます。コマンドラインオプションはこのファイルの後に評価される
ので、コマンドラインオプションの方が強いです。
デフォールトでは設定ファイルは使っていません。すべてコマンドラインです。

e.g.
	mead.pl -f /usr/local/fml/mead_config.ph ...

2.7	mead.pl コマンドラインオプション

Usage: mead.pl [options]

Options:
    -h              help
    -d              debug mode on
    -m mode         mode; report or auto ('report' in default).

    -f configfile   load configuration from this file at the first
                    Other command line options can overwrite it.
    -e number       expire of error data cache (unit is 'day')
    -i number       check interval (unit is 'second')

    -C cachefile    mead data cache file
    -D directory    $DIR (mead.pl working directory)
    -E directory    $EXEC_DIR (e.g. /usr/local/fml)
    -S directory    $ML_DIR (e.g. /var/spool/ml)
    -M path         makefml path

    -p priority     priority, e.g. -p uu=2,uh=0.5
                    (user unkwown == 2, host unkown == 0.5)
                    [KEYWORD]
                            uu: unknown user
                            uh: unknown host
                            ua: unknown address
                            us: service unavaiable 
                            default: default value for phrases not above

    -k action        'bye' is default,  off or bye.
                     change the action when mead detects a bad address.

    -l limit         limit whether we should do action defined by '-k action'

    -z sendmail      alternative sendmail path

○ -k オプション

1998/10/1
   mead.pl -k command option (default 'bye')

If you 'off' the users who causes "unknown user" error "not reachable",
you can  use '-k off' option.

-k off とすると(デフォールトではユーザを自動的に抜いてしまいますが)
それを OFF の状態にします。

2.8	問題点

forward の forward はさすがに detect できないんだよねぇ…

	fml -> a@b.org	-> a@xyz.com (error)

エラーメールは a@b.org に送ったはずなのに xyz.com でエラーになる

	 550 <a@xyz.com> user unknown

これは fml 側の配送リストにはないので削除できないわけです。

2.9	A few tips

1998/10/10
   mead.pl (Mail Error Analyze Daemon);
	Ignore Japanese Strings (which may cause an error)

	日本語を無視(誤動作する)。可能性のある文字列を全部見て
	sort |uniq してキャッシュする(first match では user unknownが
	上書きされたりするかもしれないのを回避)

2.10	VERPs (Variable Envelope Return Paths)

とりあえず qmail の場合についてのみ説明します。

VERPs については
	http://www.jp.qmail.org/qmaildoc/RFC/RFCVERP.html

$USE_VERP を設定すると $MAINTAINER アドレスをかえて qmail が送り出しま
す。

	$USE_VERP = 1; (default 0)

2.2C#6 (1999/06/19) 以降のversionではmakefml が作る見本の
    
    makefml config では
    
       top menu => SECURITY_AND_FILTER => CHECK_MAILBODY_CKSUM => "y"
    
3	qmail の VERPs での自動エラー処理のしかた

fml-support: 07462

◯ INSTALL_with_QMAIL というファイルを見ながらインストール&&qmailの設定をする

◯ elena MLを例にとると

% makefml newml elena 

と走らせると

/var/spool/ml/etc/qmail/alias/.qmail-elena
/var/spool/ml/etc/qmail/alias/.qmail-elena-admin
/var/spool/ml/etc/qmail/alias/.qmail-elena-ctl
/var/spool/ml/etc/qmail/alias/.qmail-elena-default

というファイルができる。
/var/spool/ml/etc/qmail/alias/.qmail-elena-default 
では

|/usr/local/fml/libexec/mead.pl -m report -S /var/spool/ml -D /var/spool/ml/elena -E /usr/local/fml

のように mead をよぶようになっている。自動削除なら このファイルをいじって
-m report を -m auto にかえる

◯ qmailのVERPsを使う

config.ph で $USE_VERP = 1 (defaultは0で、VREPsを使わない)を設定する

・makefml config elena のメニュー / CGIのメニュー(日本語表示)では 
トップメニュー → SMTP -> VERPs -> "y"

[解説]

この設定がされているならエラーメールが帰ってきた時は .
qmail-elena-default の中身がよばれて、自動的にエラーの集計をおこなう

◯ エラーメールログのフォーマット

in fml-support:07508

#check 950346551

	unix time での「だれを削除するか？」を決めるチェックが働いた時
	刻チェックするインターバルを決めるのに使われている。

#remove a@a.com

	実際に『削除しようと試みたアドレス』

	このあどれすがちゃんと削除されたかをチェックしてほしい

950276763 アドレス    fml-support-admin@ffs.fml.org   r=uu

エラーメールのキャッシュ。r=理由 であり理由ごとに重みパラメータが定義
されている。

この行だけでは削除にはならずある条件が満たされないと削除対象にならない。

   一定時間にある程度以上のエラーが返ること

という条件が課せられているんですが、ＭＬのトラフィックがあまりないと削
除がすすまないとかいう問題はあります。＃もっといいアルゴリズム募集中

一時的にMTAの設定を間違ってとかいう場合もあるので、問答無用に削除はちょっ
とまずいということで、そんなことになっています

◯ テスト: VERPs 使用時
in fml-support: 07509

エラーメールの偽造はメール本文はどうでもよくてメールを送り込む先を

例えば 
	elena@dom.org MLで
	間違ったアドレスが  user@do.ma.in だとすると

	elena-admin-user=do.ma.in@dom.org

宛にしてみるとエラーメールエミュレーションができるはず。

4	Mail Loops

4.1	Message-ID: Cache
See also: internals 4.2 

Message-ID: は時空全体で一意です。なので同じMessage-ID:のメールが突っ
込まれることは有り得ません。ありうる場合は

1.	出した方のソフト(MUA,MSA,MTA?)のどれかがRFC違反
2.	どっかでエラーして２通になった
	どっかに消えて無くなるよりは「疑わしい時は再送」という
	デザインのMTAもあるので、これはあってもしょうがない
3.	そのマシンのエラーで、２通になった
	例: fmlの処理の途中でマシンがリブートした時

$DIR/var/run/ の下にキャッシュファイルが作られています。デフォールトで
は各ファイルは $MESSAGE_ID_CACHE_BUFSIZE (default 60*100) bytesを越え
るとrotateしながら古いものから消去されます。最大 $NEWSYSLOG_MAX + 2 個
のキャッシュが作られます。概ね過去 100 * ($NEWSYSLOG_MAX + 2) アドレス
ほどに対して二重でないかどうかのチェックがされます。

4.2	一意なX-ML-Info: 

X-ML-Info: フィールドにはＭＬのアドレス(MLのアドレス、コマンドのアドレ
ス、管理者のアドレスのいづれか)が出てきます。例え多段のＭＬ(例えば 
ML-A -> ML-B -> ML-C -> ... のML-B)であってもX-ML-Info: に自分のＭＬア
ドレス(X-ML-Info: ML-B)はでないはずという仮定です。

メールループはMessage-ID: Cacheをすり抜けても、このルールがループと見
なすことになります。ただし「ヘッダが削除されない」という前提条件は必要
です。

5	Confirmation Daemon (libexec/confirmd.pl)

注意: FML 2.1B#2 以降の機能です。

定期的(例: 2カ月の一度)にメンバーに「これからもＭＬに入り続けるか？」
を尋ね、返事がなければ参加の意志がないものとして、そのメンバーを削除す
るプログラムです。

5.1	『反論なき場合は削除に同意』デーモン?:-)

ＭＬによっては定期的にメンバーをチェックしたい場合があります。confirmd 
は定期的(デフォールトは2カ月の一度)にメンバーに「これからもＭＬに入り
続けるか？」を尋ねます。一定期間内(デフォールトでは２週間以内)にメンバー
から返事があればOK、もし返事がなければそのメンバーを削除します。返事が
あった場合その後2カ月(デフォールト)間は有効です。2カ月たつと再び「これ
からもＭＬに入り続けるか？」を尋ねられます。

confirmd.pl はまとめおくりの msend.pl 同様に cron から起動するように設
定します。起動間隔は crontab でコントロールします。チェックをかけるた
めには当然『2カ月』および『2週間』より短い間隔で起動しないと意味があり
ません。といってかけ過ぎても無駄なだけです。makefml newml で作成される 
crontab の見本では一日一回になっています。

5.2	設定の仕方

makefml が作る crontab の見本 $DIR/crontab では confirmd の行はコメン
トアウトされています。このコメントをはずし crontab でシステムの cron 
にセットします。デフォールトでは一日一回朝5時に confirmd が起動という
設定になっています。
Example:

    # confirmd
    # * 5 * * * _EXEC_DIR_/libexec/confirmd.pl _ML_DIR_/_ML_ _EXEC_DIR_

5.3	時間の変数

confirmd は入り続けるという意思表示(具体的には 'ack'コマンドを返した時)
から

	$CONFIRMD_ACK_EXPIRE_UNIT (デフォールトは2ヶ月)

期間の間その意思表示を有効とみなします。この期間が過ぎると「これからも
ＭＬに入り続けるか？」という確認を送ります。このメールの返事を

	$CONFIRMD_ACK_WAIT_UNIT (デフォールトは2週間)

期間待ちます。この期間内に返事がないなら confirmd はこのメンバーをＭＬ
から削除します。

なお使える時間の表現は次のようなものです。

	Regular Expression	Example
	------------------------------------
	\d+ month(s)		2 months
	\d+ week(s)		2 weeks
	\d+ day(s)		2 days
	\d+			3600

5.4	ファイル

	$CONFIRMD_ACK_REQ_FILE ($DIR/confirmd.ackreq)

がユーザーに「これからもＭＬに入り続けるか？」という確認を送る際のメー
ルのテンプレートです。このファイルがない場合(makefml newml では生成さ
れない)は fml のインストール先の drafts/confirmd.ackreq
(e.g. /usr/local/fml/drafts/confirmd.ackreq) が使われる。

	$CONFIRMD_ACK_LOGFILE

には返事('ack'コマンド)のログが残り、いつ返事をしたかのデータとして 
confirmd が用いる。


		INDEX

$CONFIRMD_ACK_LOGFILE                      ...   5.4 
$CONFIRMD_ACK_REQ_FILE                     ...   5.4 
