エラーメール解析プログラム (libexec/error)
/usr/local/libexec/fml/error
は
&fml4;
の
mead (libexec/mead) に相当するエラー解析プログラムです。
$use_error_mail_analyzer_function を yes にすると、
エラー解析機能が有効になります。
ちなみに、
デフォルトで
$use_error_mail_analyzer_function は yes
です。
つまりエラー解析機能は有効になっています。
このあたりは &fml4; と異なります。
つまるところ、
&fml8;
では
&fml4;
でよく使う機能は初めから有効になっています。
概要
ML作成時に
$ml-admin アドレス宛のメールは
/usr/local/libexec/fml/error
を呼び出すように設定されます。
/usr/local/libexec/fml/distribute などと同様に
/usr/local/libexec/fml/error
は標準入力からメールを読みこみ、
それを解析し、Mail::Message オブジェクトの鎖を作ります。
そして Mail::Bounce クラスがエラー内容の解析をします。
Mail::Bounce は、エラーメールについて
「どの MTA が生成したものか?」
「エラーを引き起こしたメールアドレス」
「エラーの理由」
を分析します。
解析結果は
$error_mail_analyzer_cache_dir
ディレクトリに格納されます。
一定時間以上経過すると、
$error_mail_analyzer_function
がキャッシュのデータを解析し、
あるメールアドレスが存在しないように思えるか否か?を判定します。
その結果、消すべきだと判断されると、削除されます。
「一定時間」
と
「消すべきか?という判断」
この二つが主なチューニングパラメータになります。
エラー判定のアルゴリズム
$error_mail_analyzer_function_select_list
にある関数名が利用し得るアルゴリズムです。
デフォルトでは
simple_count
と
histgram
という2つのアルゴリズムが用意されており、
histgram がデフォルトです。
アルゴリズム: simple_count
単純にエラーが返ってきたメールの総数で「削除するか否か」の決断を判定します。
単純にエラー数なので、
”たまたま”受信者が設定を少しの間だけ間違えていて、
”たまたま”その日の流量が多い場合、
その受信者は
「削除対象」
とみなされることになります。
そういった場合にも、ようしゃなく削除してしまうのが、この方法の問題点です。
アルゴリズム: histgram
エラーが連続してN日続いた時にかぎり削除を行ないます。
デフォルトでは 14 日(つまり二週)のあいだ連続してエラーの場合に、
はじめてアドレスの削除が行なわれます。
デメリット:
少なくとも一日一通は流量がないと、このアルゴリズムは動作しません。
メリット: ちょっと間違えただけの受信者が削除されることはありません。
現在のデフォルトは、このアルゴリズムです。
注意: 当然のことながら、流量が一日一通に満たないような、
まったりとしたMLでは、このアルゴリズムは動作しません:-)
データのキャッシュ
各エラーメール(らしきもの)の解析結果は
$error_mail_analyzer_cache_dir
ディレクトリに格納されます。
現在、キャッシュの入出力には
Tie::JournaledDir
クラスを使っています。
正確には
FML::Error::Cache というアダプタ層が Tie::JournaledDir の直前に位置し、
FML::Error::Cache 経由で Tie::JournaledDir への IO を行ないます。
すべての IO は、FML::Error::Cache が提供する
primitive
なメソッドを通じてのみ行なわなければなりません。
エラーメッセージをフォワードする
$maintainer_recipient_maps
を使うと、エラーメッセージの転送先を指定することができます。
デフォルトは「未定義」で、転送は行なわれません。
つまり &fml8; がエラーメールのログを残すだけです(安全ですので推奨)。
フォワードする設定をした場合は?というと、
単にエラーメールのフォワーディングが行なわれるだけです。
エラーメール( message/rfc822 )を一通だけ含む無味乾燥な
mime/multipart がMLの管理者へ送信されます。
そのうち、
「ヘッダ情報 + そのエラーメールのアドレスの分析レポート」
など、もう少し付加的な情報もつけるべきでしょうか
(と考えつつ、未実装のままです)?
リファレンス: fml-devel ML 451 あたりを参照。