5. FreeBSD 11.1 RELEASE - qmail - メール配送設定 procmail

 
 ウィルススキャンの結果ウィルス判定したものを破棄したり、あるメールアドレスからのメールを別のメールアドレスに転送したり、受信したメールの振り分けを行いたいことは多々あります。  /home/ユーザ名/.qmail に記述することであることである程度はできますが、少し応用の聞いた処理をしたいときは、procmail を使用します。  procmail のインストールは「1. 初期設定」のところで一緒にインストールするように記述していますので、ここを読んだ方は既にインストール済かと思います。  本項の多くは「Procmail の紹介とレシピの書き方」を参考にさせていただいております。
5.1 基本設定
5.2 基本的な転送設定
5.3 環境変数
5.4 スパムメールを転送する
5.5 詐称メールを転送する
5.6 ブラックリストによる転送
5.7 日本語キーワードによる転送

5.1 基本設定

 とりあえず、何の転送をしないにしても後で設定できるようにしておくには  /home/ユーザ名/.procmailrc というファイルを作成して

PATH=/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
 と記述しておきます。ちなみにこの /home/ユーザ名/.procmailrc に記述する内容をレシピと言うそうです。  次に /home/ユーザ名/.qmail を以下のように書き換えます。

| /var/qmail/bin/preline /usr/local/bin/procmail ./.procmailrc
 とりあえずは、ここまでで OK。再起動も何も必要ありません。  このデフォルトを以降の新規ユーザにすべて適用するには
/usr/share/skel/dot.qmail
/usr/share/skel/dot.prcomailrc
 を作成して、先ほどと同じ内容を記述しておきます。

5.2 基本的な転送設定

 特定アドレス(例:hoge01@fromhoge.co.jp)から来たメールを別のアドレス(hoge02@tohoge.co.jp)に転送するには .procmailrc に以下のように書きます。

#   hoge01@fromhoge.co.jp から来たら hoge02@tohoge.co.jp に転送するのだ
0:
* ^From:.*hoge01\@fromhoge\.co\.jp.*
! hoge02@tohoge.ne.jp

#   ・・・
 これはおなじみ、行頭の「#」はコメント行になります。  コメントは、コメント行のみで、レシピを記述している行の途中に「#」を記述する場合、その後ろがコメントになるのではなくと「#」何らかの意味をあらわすものになるので注意が必要です。

0:
 「0:」はこの行からレシピの記述がはじまるという意味です。  「0:」から次の「0:」かファイルの終端がくるまでが1つのレシピとなります。

* ^From:.*hoge01\@fromhoge\.co\.jp.*
 の先頭の「*」はこの行が条件文であることを意味します。  「^From」は行頭が「From」という意味でメールヘッダについてご存知ならすぐわかるかと思います。  「^」を含めここの文は、正規表現を使用しています。procmail の正規表現については「別稿」で簡単に説明しています。

! hoge02@tohoge.ne.jp
 の先頭の「!」はこの行で示すメールアドレスにメールを転送することを意味します。メールアドレスはスペースで区切って、複数アドレスを列挙可能です。こちらは正規表現でなく、生のメールアドレスで記述します。  この行の先頭に「!」をつけず、「/dev/null」とした場合、メールはどこにも転送も保存もされず、消えてなくなります。

5.3 環境変数

 主な(わたしが使っている)環境変数をあげておきます。
環境変数 意 味
DEFAULT どのレシピにも適合しなかった場合に格納する先を記述します。
通常は DEFAULT=$MAILDIR と記述します。
INCLUDERC 他のファイルの記述をインクルードすることができます。
共通的な設定を使用するときに便利です。
INCLUDERC=ファイル名 と記述します。
LOGFILE 処理内容のログをファイルに出力するときに LOGFILE=ファイル名 の型式で記述します。
MAILDIR メールディレクトリの指定です。 qmail の場合、通常は MAILDIR=$HOME/Maildir/ と記述することになります。
VERBOSE ログの内容を詳細に出力する際 VERBOSE=on と記述します。デフォルトは off です。

5.4 スパムメールを転送する

 SpamAssassin を使用している場合、わたしは、スパムとみなしたメール受信専用のユーザをつくっておいてそこに集めるようにしています。誤認識する場合もあるので、その受信専用ユーザのメールをときどきチェックしています。

:0
* ^X-Spam-Flag: YES
! スパムメール受信専用メールアドレス
 と記述します。  SpamAssassin でスパムと判断したメールにはヘッダに「X-Spam-Flag: YES」という行があるのです。

5.5 詐称メールを転送する

 よく「docomo.ne.jp」「ezweb.ne.jp」「softbank.ne.jp」「yahoo.co.jp」「gmail.com」を名乗ったスパムメールが来ます。スパムと判定されないこともありますが、これを前項の「スパムメール受信専用メールアドレス」に転送するようにします。  この手のメールは、From のアドレスと Return-Path のアドレスが違っているのです。

:0
* ^From:.*@docomo\.ne\.jp
* ! ^Return-Path:.*docomo\.ne\.jp>
! スパムメール受信専用メールアドレス
 これは From が「docomo.ne.jp」で Return-Path が「docomo.ne.jp」でなければ「スパムメール受信専用メールアドレス」へ転送するという設定です。

5.6 ブラックリストによる転送

 SpamAssassin からすりぬけてもある特定のドメインから来るものは、確実にスパムであると判断できることがあります。これを転送するとします。  /ディレクトリ/.blacklist というファイルを作成して、これにメールアドレスを1行に1アドレスずつ記述しておきます。  そして、レシピに以下のように記述します。

BLACKLIST=/ディレクトリ/.blacklist

# ブラックリストのメールアドレスが含まれていたら スパムメール受信専用メールアドレス  に転送する
:0
* ? /bin/test -s $BLACKLIST
* ? (formail -x Received: -x From: -x Reply-To: -x Sender: -x Return-Path: -x From | fgrep -iqf $BLACKLIST)
! スパムメール受信専用メールアドレス
 「* ? /bin/test -s $BLACKLIST」の行は、ブラックリストファイルの存在確認です。  「* ? (formail -x Received: -x ...」の行は、メールヘッダの「Received:」「From:」「Reply-To:」「Sender:」「Return-Path:」のいずれかにブラックリストに含まれるメールアドレスが存在するか?というチェックです。  存在すれば、「スパムメール受信専用メールアドレス」に転送することになります。  ブラックリストファイルに記述するメールアドレスは、部分文字列でも可能ですので、特定のドメインがわかっていれば、ドメインの文字列のみ記述しても OK です。

5.7 日本語キーワードによる転送

 スパムメールの判断のひとつに「From:」や「Subject:」によって判断できるものがあります。  例えば、「From:」に「天野友二」という文字がはいっていたり、「Subject:」に「援助交際」という文字がはいっていればあきらかにスパムメールなわけです。  これを判定するには以下のように記述します。

#   「援助交際」
:0
* ^Subject:.*iso-2022-jp
* ^Subject:\/.*
* ? echo "$MATCH" | nkf -meZ2 | sed 's/[[:space:]]//g' | egrep '援助交際'
! スパムメール受信専用メールアドレス
 「* ? echo "$MATCH" | ...」の行は、「Subject:」内の文字列をエンコードして「援助交際」という文字列が存在するか?という判断になります。