メールサーバーでPostfixを使う人は多いと思います。
Wietse Venemaらが開発したフリーソフトウェア・オープンソースソフトウェアのメール転送エージェントとして有名です。
今回は、Postfixで独自のスパムフィルターを追加する方法を書き溜めておきます。
CentOS7の場合、Postfixをyumでインストールすると、/etc/postfixが作成されます。
概要
ヘッダーでフィルターする際はheader_checksを編集する
まず、/etc/postfix/main.cfを編集します。
regexpをつけ忘れないように。
1 2 |
# 下記の一行を追加 header_checks = regexp:/etc/postfix/header_checks |
/etc/postfix/header_checksを編集します。
もし/etc/postfix/に存在していなかったら
新規で作成して問題ないので作ってください。
下は例です。
メール件名に「BestSalesForYou」と書いてあった場合拒否する。
という設定です。
1 |
/^Subject:.*BestSalesForYou.*/ REJECT |
こんな感じに書いていきます。
メール本文でフィルターする際はbody_checksを編集する
メール本文でフィルターをする場合もまず、/etc/postfix/main.cfを編集します。
header_checksと同様、regexpをつけ忘れないように。
1 2 |
#下記の一行を追加する regexp:/etc/postfix/body_checks |
/etc/postfix/body_checksを編集します。
もし/etc/postfix/に存在していなかったら
新規で作成して問題ないので作ってください。
下は例です。
メール本文に「Bitcoin」または「bitcoin」と書いてあった場合拒否する。
という設定です。
1 |
/^Subject:.*(b|B)itcoin.*/ REJECT |
こんな感じに書いていきます。
日本語をフィルターする際はエンコードする
特に注意してほしいのが日本語の正規表現フィルターです。
エンコードしないと駄目です!
例えば、「当選情報です」と書かれているものをフィルタリングしたい場合、
下記のように書いては動きません。
1 |
/^Subject:.*当選情報です.*/ REJECT |
実際に送信される文字コードにエンコードする必要があります。
例えばUTF-8をBase64でMIMEにエンコードしたら下記になります。
1 |
/^Subject:.*=¥?UTF-8¥?B¥?5b2T6YG45oOF5aCx44Gn44GZ.*/ REJECT |
これ忘れないようにね。
そのまま日本語使ってもだめだし、エンコードしたあと、エスケープも忘れないようにね。
nkfというパッケージを使えばエンコードとかもかんたんにできます。
とりあえずよくあるパターンだけ、書き溜めておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/bash stdin=`cat` echo "utf8 Base64 to MIME" echo "$stdin" | nkf -M echo "" echo "utf8 quoted-printable to MIME" echo "$stdin" | nkf -MQ echo "" echo "utf8 Base64 to MIME(JIS)" echo "$stdin" | nkf -jM echo "" echo "utf8 quoted-printable to MIME(JIS)" echo "$stdin" | nkf -jMQ echo "" |
これはパイプで使ってください。
echoをパイプで標準入力で渡せば、変換します。
1 2 3 4 5 6 7 8 9 10 11 |
$ echo "当選情報です" | ./converter.sh utf8 Base64 to MIME =?UTF-8?B?5b2T6YG45oOF5aCx44Gn44GZ?= utf8 quoted-printable to MIME =E5=BD=93=E9=81=B8=E6=83=85=E5=A0=B1=E3=81=A7=E3=81=99 utf8 Base64 to MIME(JIS) =?ISO-2022-JP?B?GyRCRXZBKj5wSnMkRyQ5GyhC?= utf8 quoted-printable to MIME(JIS) |
役に立てばいいな。
じゃあね〜〜。