以前、PostfixからClamSMTPとSpamAssassinを利用するための設定例として
モーグルとカバとパウダーの日記 - Postfixの設定でClamSMTPとSpamAssassinを利用する
というエントリーを書いたんですが、これにはちょっと問題がありました。
SpamPDを利用するパターンの時、送信時にもSpamPDを通ってしまう、というものです。
この例だと
- 受信メール:ClamSMTP→SpamPD
- 送信メール:ClamSMTP→SpamPD
と送信メールについてもSpamPDのフィルタを通してしまう(そしてヘッダに余計な情報を付けてしまう)んですが、これを
- 受信メール:ClamSMTP→SpamPD
- 送信メール:ClamSMTP
というフィルタになって欲しいわけです。
これは以前やまぐちたかのりさんに指摘いただいてたんですが、(.forwardとかからspamc呼ぶ以外で)ずっと上手い解決が出来ずにいました。
が、やっとこ良い方法が思いついたのでメモ。
Postfixの「FILTER」の指定って、その場ですぐにフィルターに渡しちゃうのではなくって、最終的にメールを受け取ったときどこをフィルター通すか指定してある「content_filter」を上書きしてるだけなんですね。
なので、標準のcontent_filterではClamSMTPだけを通すように指定しておき、reject_unauth_destinationを抜けた先ではFILTERの指定でもってcontent_filterをSpamPDを通すように指定するようにしました。SpamPDの出力先をClamSMTPにしておくことで、どちらのフィルタも通ってきてくれます。
受け取るポート:受け取るデーモンという表記とすると、こんな感じの構成です。
- 受信メール: 25:Postfix->10025:SpamPD->10026:ClamSMTP->10027:Postfix
- 送信メール: 25:Postfix->10026:ClamSMTP->10027:Postfix
/etc/postfix/main.cf
smtpd_recipient_restrictions = ... reject_unauth_destination check_client_access regexp:$config_directory/filter_spampd ... content_filter = scan:127.0.0.1:10026 receive_override_options = no_address_mappings
/etc/postfix/filter_spampd
/./ FILTER scan:127.0.0.1:10025
/etc/postfix/master.cf
# AV scan filter (used by content_filter) scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes # For injecting mail back into postfix from the filter 127.0.0.1:10027 inet n - n - 16 smtpd -o content_filter= -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks_style=host -o smtpd_authorized_xforward_hosts=127.0.0.0/8
/etc/clamsmtpd.conf の該当行は以下のようになっているのを確認
OutAddress: 10027 Listen: 127.0.0.1:10026
/etc/default/spampd の該当行を以下に修正
STARTSPAMPD=1 LISTENPORT=10025 DESTPORT=10026
あと、SpamPDって、spamdが起動してなくっても使えるんですよね。
ついこないだまで気がつかずに、ずっとspampdとspamdどっちも起動するようにして使ってました…