Mac OS X Server (10.8.4 Mountain Lion) で、abmilter と Sieve を用いた迷惑メール対策の方法を説明します。
abmilter とは、迷惑メール対策ツール「abmail」を milter アプリケーションとして利用できるようにするプログラムです。
以下の説明においては、/opt/local/sbin に abmilter がインストールされているものとします。他のディレクトリにインストールされている場合は、/opt/local/sbin を abmilter がインストールされているディレクトリに適宜読み替えてください。abmilter のインストールに関しては以下を参考にしてください。
まず、abmilterを自動起動させるため、以下のパスに plist ファイルを作成します。
/Library/LaunchDaemons/jp.co.aihara.abmilter.plist
plist ファイル jp.co.aihara.abmilter.plist の内容は次のようにします。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>jp.co.aihara.abmilter</string> <key>Disabled</key> <false/> <key>UserName</key> <string>postfix</string> <key>GroupName</key> <string>mail</string> <key>ProgramArguments</key> <array> <string>/opt/local/sbin/abmilter</string> <string>-socket=unix:/Library/Server/Mail/Data/spool/private/abmilter</string> <string>-action=addheader</string> <string>-b</string> <string>-g</string> <string>-d</string> <string>-v</string> <string>-vv</string> <string>-vvv</string> </array> <key>OnDemand</key> <false/> </dict> </plist>
ここで、UserName と GroupName は、ProgramArguments の -socket= で指定されている postfix との通信のためのソケット
/Library/Server/Mail/Data/spool/private/abmilterを作成できる権利を持つユーザ、グループである必要があるため、それぞれ postfix と mail にしています。
また、ProgramArguments で指定されている -action=addheader によって、abmilter の動作は、迷惑メールと判定されたメールに "X-Abmail-Flag: Yes" というヘッダ情報を付加する設定になります。
上記で Mac の起動時に自動的に abmilter が起動されるようになりますが、Mac を再起動せずとも、以下のコマンドで手動で abmilter を起動することができます。
$ sudo launchctl load /Library/LaunchDaemons/jp.co.aihara.abmilter.plist
なお、abmilter を停止するには、以下のコマンドを実行します。
$ sudo launchctl unload /Library/LaunchDaemons/jp.co.aihara.abmilter.plist
また、これは運用中の話になりますが、/opt/local/etc/abmail/*.lst を更新したときは、それを反映されるため、上記のコマンドで一度 abmilter を停止して、再度起動してください。
次に、postfix の設定ファイル
/Library/Server/Mail/Config/postfix/main.cfに、以下の設定パラメータを追加します。
milter_default_action = accept smtpd_milters = unix:/Library/Server/Mail/Data/spool/private/abmilter
milter_default_action は、なんらかのトラブルで milter が使えないときの動作を指定するパラメータで、accept は milter が存在しないかのように進める設定です。
smtpd_milters は、milter との通信のためのソケットを指定するパラメータです。plist ファイル jp.co.aihara.abmilter.plist の ProgramArguments において、-socket= で指定されているソケットと合わせてください。
main.cf の設定を変更したら、Server.app からメールを一度停止して、再度起動します。これで、postfix から abmilter が使えるようになり、再起動後に届くメールが迷惑メールと判定されると "X-Abmail-Flag: Yes" というヘッダ情報が付加されるようになります。
なんらかの理由で abmilter が異常終了した場合、プロセスが存在しないにもかかわらず、ソケットが残っていることがあります。その場合、以下の手順でソケットを削除して、abmilter を再起動させてください。
まず、以下のコマンドで abmilter プロセスが存在しているか確認します。
$ sudo ps -ef | grep abmilter
次に、以下のコマンドで abmilter ソケットが存在しているか確認します。
$ sudo ls /Library/Server/Mail/Data/spool/private/abmilter
abmilter プロセスが存在せず、ソケットが存在している場合は異常な状態ですので、以下のようにソケットを削除してから、abmilter を再起動させてください。
$ sudo launchctl unload /Library/LaunchDaemons/jp.co.aihara.abmilter.plist $ sudo rm /Library/Server/Mail/Data/spool/private/abmilter $ sudo launchctl load /Library/LaunchDaemons/jp.co.aihara.abmilter.plist
Mac OS X Server では、メールフィルタリング言語の一つである Sieve が利用可能で、特定のパスに Sieve スクリプトファイルを置いておくことで、サーバサイドで、メールを指定したimapフォルダへ振り分けたり、転送することなどができます。
Sieve スクリプトを置いておくパスなど、Mac OS X Server 10.8.4 での Sieve の利用方法は以下を参照してください。
では、abmilter と連係して、迷惑メールを spam.受信年月日 フォルダへ自動的に振り分ける Sieve スクリプトの例を以下に記します。
require "fileinto";
require "mailbox";
require "variables";
require "date";
if header :is "X-Abmail-Flag" "Yes" {
if currentdate :matches "year" "*" { set "year" "${1}"; }
if currentdate :matches "month" "*" { set "month" "${1}"; }
if currentdate :matches "day" "*" { set "day" "${1}"; }
fileinto :create "spam.${year}.${month}.${day}";
}
この例では、メールヘッダに "X-Abmail-Flag: Yes" があった場合に、spam.受信年月日 という名前のフォルダにそのメールを振り分けます。ただし、受信年月日は YYYY.MM.DD という形式です。例えば、2013年10月1日であれば spam.2013.10.01 となります。また、そのフォルダが存在しない場合は自動的に作られます。このフォルダはユーザのメールソフトからは spam/年/月/日/ のように階層構造となって見えます。
さて、Sieve スクリプトを置くパスにはユーザの GeneratedUID が含まれており、それを調べて手動で作成するのは手間です。そこで、それを解消する一例を以下に示します。これは、ログイン名を指定するだけで、必要なディレクトリとスクリプトファイルを作成してくれるシェルスクリプトとスケルトンファイルです。さらに、メールの転送を行うようにするスクリプトを作成することもできます。
これらを /opt/local にインストールした場合には特に修正の必要はありませんが、それ以外にした場合、インストールしたディレクトリに合わせて、gen-dovecot.sieve.sh 内の変数 skel_dir を変更してください。
上記 tarball に含まれるファイルのリストを以下に記します。
bin/gen-dovecot.sieve.sh etc/skel/dovecot.sieve
このスクリプトは以下のように使用します。
まず、--dry-run オプションを付けて、
$ /opt/local/bin/gen-dovecot.sieve.sh --dry-run -sw_antispam on -u $LOGANMEとします。特に問題がなければ、作成されるファイルやディレクトリの名前などが表示されますので、確認しておきましょう。
$ sudo /opt/local/bin/gen-dovecot.sieve.sh -sw_antispam on -u $LOGNAMEとします。
ここまで Mac OS X Server 10.8.4 での方法を説明してきましたが、それ以外でも、abmilter と Sieve が利用可能であれば同様の対策が可能です。
ただし、Mac OS X Server はバージョンによって設定ファイルなどのパスに違いがあるので、それに合わせる必要があります。
具体的に、Mac OS X Server 10.6.8 Snow Leopard の場合は以下のようになりますので、これに合わせて前述の説明を適宜読み替えてください。
/etc/postfix/main.cf
/var/spool/postfix/private/abmilter
/var/spool/imap/dovecot/sieve-scripts/$GUID/dovecot.sieve
そして、Mac OS X Server 10.6.8 で Sieve を利用するには、Server.app のメールの設定で、フィルタタブにある Server-side mail rules を有効にしておく必要があります。
また、Mac OS X Server 10.6.8 では Sieve の拡張がほとんど使えません。そのため、前述のように日付毎の spam フォルダに迷惑メールを振り分けることができません。また、フォルダが存在しなかった場合に自動的に作成してくれる拡張もないため、予め振り分け先のフォルダを作成しておく必要があります。
以上を踏まえると、Mac OS X Server 10.6.8 では、予め作成してある spam フォルダに迷惑メールを振り分けるという方法を採用するのがよいと考えられ、それに対応した Sieve スクリプトは以下の例のようになります。
require "fileinto";
if header :is "X-Abmail-Flag" "Yes" {
fileinto "spam";
}