<!--
   $FML: errormail.sgml,v 1.3 2004/02/24 14:26:58 fukachan Exp $
-->


<chapter id="error.internal">
	<title>
	エラーメール解析プログラム (libexec/error)
	</title>

<para>
libexec/error は &fml4; の libexec/mead に相当するものです。
</para>

<para>
$use_error_mail_analyzer_function を yes にすると、エラー解析機能が有効にな
ります。ちなみに、デフォルトで $use_error_mail_analyzer_function は yes つま
りエラー解析機能は有効になっています。このへんは &fml4; と異なります。
&fml8; では、&fml4; でよく使う機能は始めから有効になっています。
</para>


<sect1 id="error.internal.overview">
	<title>
	概要
	</title>

<para>
ＭＬ作成時に $ml-admin のアドレスは libexec/error を呼び出すように設定
されます。
</para>

<para>
distribute などと同様に libexec/error は標準入力からメールを読みこみ、
それを解析し、Mail::Message オブジェクトの鎖を作ります。そして、
Mail::Bounce クラスがエラー内容の解析をします。
</para>

<para>
Mail::Bounce は、エラーメールについて「どの MTA が生成したものか？」
「エラーを引き起こしたメールアドレス」「エラーの理由」を分析します。
</para>

<para>
解析結果は $error_analyzer_cache_dir ディレクトリに格納されます。
</para>

<para>
一定時間以上経過すると、$error_analyzer_function がキャッシュのデータ
を解析し、あるメールアドレスが存在しないように思えるか否か？を判定しま
す。その結果、消すべきだと判断されると、削除されます。
</para>

</sect1>


<sect1 id="error.internal.algorithm">
	<title>
	エラー判定のアルゴリズム
	</title>

<para>
$error_analyzer_function_list にある関数名が利用し得るアルゴリズムです。
現在は simple_count histgram という２つのアルゴリズムがあり、histgram 
がデフォルトです。
</para>


<sect2>
	<title>
	アルゴリズム: simple_count
	</title>

<para>
単純にエラーが返ってきたメールの総数で、エラーか否かを判定します。
</para>

<para>
単純にエラーの数ですので、たまたま受信者が設定を少しの間だけ間違えてい
て、たまたまその日の流量が多い場合には、その受信者はエラーとみなされる
でしょう。そういった場合にも、ようしゃなく削除します。
</para>

</sect2>


<sect2>
	<title>
	アルゴリズム: histgram
	</title>

<para>
エラーが連続してＮ日続いた時に限り、削除を行ないます。
デフォルトでは14日連続してエラーの場合に削除が行なわれます。
</para>

<para>
少なくとも一日一通は流量がないと、このアルゴリズムは動作しませんが、
ちょっと間違えただけの受信者が削除されることはありません。
</para>

<para>
現在のデフォルトは、このアルゴリズムです。
</para>

</sect2>

</sect1>


<sect1 id="error.internal.cache">
	<title>
	データのキャッシュ
	</title>

<para>
解析結果は $error_analyzer_cache_dir ディレクトリに格納されます。
</para>

<para>
現在、キャッシュの入出力には Tie::JournaledDir クラスを使っていますが、
正確には FML::Error::Cache 経由で Tie::JournaledDir への IO を行ないま
す。
</para>

<para>
FML::Error::Cache が Tie::JournaledDir の直前に位置し、アダプタとなり
ます。すべての IO は、FML::Error::Cache が提供する primitive なメソッ
ドを通じてのみ行なわなければなりません。
</para>

</sect1>


<sect1 id="error.internal.message.forward">
	<title>
	エラーメッセージをフォワードする	
	</title>

<para>
<screen>
$maintainer_recipient_maps
</screen>
で、エラーメッセージの転送先を指定することができます。
デフォルトは未定義で、転送は行なわれません。
&fml8; がログを残すだけです。
</para>

<para>
現在は、単にエラーメールをフォワーディングしてるだけです。中身は
message/rfc822 一通だけの無味乾燥な mime/multipart です。
</para>

<para>
そのうち、ヘッダ情報 + そのエラーメールのアドレスの分析レポートとか
なんか付けてやれや〜とかちょっと思ってはいるっす。
</para>

<para>
リファレンス: fml-devel ML 451 あたりを参照かな。
</para>

</sect1>


</chapter>
