Ubuntu 9.10で「dspamd」デーモンを実行し、次のようなPostfixルールを設定することで、スパムフィルタリングに dspam を使用しています。
smtpd_recipient_restrictions =
...
check_client_access pcre:/etc/postfix/dspam_everything
...
そのPCREマップは次のようになります。
/./ FILTER lmtp:[127.0.0.1]:11124
これはうまく機能し、「dspam」が無実であると見なすかどうかに関係なく、システム上のすべてのユーザーがすべての電子メールを受信し、その決定をフィルタリングするか無視するかを選択できることを意味します。
問題は、電子メールアーカイブを使用してdspamをトレーニングしたいときに発生します。 「dspam」コマンドについて読んだ後、受信トレイとスパムボックス(別のフィルタリングソリューションを使用していたときからの日付)のファイルでこれを試しました。
for file in Mail/Inbox/*; do cat $file | dspam --class=innocent --source=corpus; done
for file in Mail/spam/*; do cat $file | dspam --class=spam --source=corpus; done
これらすべてを実行した後に気付いた症状は、dspamがスパムの分類にひどいことでした—何も見つかりませんでした!問題を追跡したところ、上記のコマンドを使用してユーザー「brandon」をトレーニングしていましたが、受信メールがユーザー名「brandon @ mydomain」と比較されたため、完全に空のトレーニングデータベースに対して実行されていました。 !!
では、上記のコマンドで、裸のユーザー名ではなく、完全修飾の電子メールアドレスを実際にトレーニングするにはどうすればよいでしょうか。 「--user」オプションを指定して「dspam」をrootとして実行する必要はありません。 「dspam」構成ファイルには「append_domain」属性など、ローカルユーザー名を適切な電子メールドメインで装飾するための属性があると思っていましたが、そのようなものは見つかりませんでした。
Berkeley DBバックエンドを「dspam」に使用していたとき、データベースの1つから別のデータベースへのシンボリックリンクを作成することでこの問題を解決しました。 :-)しかし、BDBバックエンドがスレッドセーフではないため、そのソリューションは最終的には消滅しました。そのため、PostgreSQLバックエンドに移動し、そこで問題を解決する方法が必要になりました。また、ユーザー名を保持するテーブルにはUNIQUE制約があり、両方のユーザー名を同じIDへのマッピングとしてリストすることはできません。 :-)
簡単な解決策は、共有接種グループを設定することです
me:brandon、brandon @ mydomain.com
/ var/pool/dspam/group-Debianインストールの場合
デフォルトでは、Debianで接種グループ/共有グループを有効にすると思います。この場合、ユーザーディレクトリにグループファイルを作成するだけで、自動的に使用されます。