目次 | CGIレスキュー | 免責・問合
  Procmailの活用

(株)友林堂
(株)友林堂


概要

これはCGIプログラムの話ではありません。 電子メールを任意に仕分等をする方法です。 私はダイレクトメールに悩まされていて、特定のメールアドレスやタイトルのメールをどうにかできないか困っていた折に、 procmailというものの利用を紹介され、ちょっと探ってみましたので、 簡単にレポートしたいと思います。

たとえば、毎日のように@hotmail.comから届くダイレクトメールや、 make money..のような題名のセールスメールを、見ずして処理できないか、 また、特定の題名のメールを、メールソフトで自動振り分けするように、 受信する前に、自動的に指定のフォルダに溜めていきたいとか、 特定の題名のメールが着たら、指定の内容を自動的に返信するとか・・・

準備

まず、あなたが使っている(メール兼用)サーバで、procmailが使えるかどうかを、 プロバイダに問い合わせて確認する必要があります。さらに、メッセージ出力にはformailを使いますので、 使えるかどうかも確認しておきます。使える場合はそのパスを教えてもらってください。 少なくとも、.forwardなどの設定ファイルを自由に使えるサーバでないと設置は無理かもしれません。

次に説明する方法は、私が主にメールとプログラムダウンロード用に利用しているアスクネット、 Web裏技やフォームデコードサービスなどで利用しているコムコムくらぶのバーチャルサーバ(99/3/14現在では同機能利用は非公認)において、 実際に設置して利用している設定方法です。

同じ方法がそのまま使えるとは限りませんので、参考程度にどうぞ。

私が参考にしたサイトは次の通りです。

基本設定

.forward には次の1行を記述します。最初と最後の"も含まれます。 次の .procmailrc と同様に、ホームディレクトリに設置します。 ホームページディレクトリではありませんので、間違いなく。 シェル上で ~user を意味する場所です。Web上で ~user を意味する場所とは違うので、 混同しないようにしてください。シェルで引数なしで cd した時に移動する場所です。 .cshrc とか .login などの設定ファイルがあるところです。

"| IFS=' ' && exec /path/to/procmail -f- || exit 75 #user"

最後の改行を忘れずに。/path/to/procmail はあなたのサーバに合わせ、 user はあなたのユーザ名です。そのほかはそのままコピーします。 これによって、受信されたメールは、メールスプールに行く前にprocmailで処理されます。

次に、procmailの動作をスクリプティングします。 基本は上記のサイトなどで勉強してきてください。 など、行左端が#の場合はコメント行となります。 上に記述したものから優先適用されます。

# .procmailrc 設定例
#
#   :0 フラグ
#   *  条件ライン
#   アクションライン
#
#
#(正規表現などの簡易一覧)
# ^ -- 行頭 
# $ -- 行末 
# . -- 任意の文字(改行コードは含まない) 
# a* -- a で始まる0文字以上の長さの文字列
# .* -- 任意の長さの文字
# a+ -- a で始まる1文字以上の長さの文字列
# a? -- a 1文字あるいはなにもなし 
# [abc] -- a か b か c の1文字 
# [a-z] -- a から z までのどれか1文字 
# [^a-z] -- a から z までのどれでもない1文字 
# (FOO|BAR) -- FOO または BAR の意味
# ! -- ではないということ
#
# ※正規表現で使われる文字を指定したい場合は\を直前に置いてエスケープする.
#   例 \. -- ドット1文字 (\がないと、.は任意の文字を示すことになってしまう)
#
# メールヘッダの書式も覚えましょう
# Subject: TITLE
#        ^^:の次には半角スペースがある
#   実際の電子メールのヘッダをよく見て覚えましょう

#-----------------------------------------------------------
#基本設定

#指定しなければログは残さない
#(指定するとメールが届く度に記録されるので注意)
LOGFILE=/usr/home/user/procmail.log

#基本となるフォルダ
# アクションラインで . とすると、MAILDIRで設定した/usr/home/user/Mail/ を指し、
# test/. とすると、/usr/home/user/Mail/test/ を意味する。
MAILDIR=/usr/home/user/Mail/

#通常のメールスプール(省略すれば適切な場所が指定されるであろう)
DEFAULT=/var/spool/mail/user

#-----------------------------------------------------------
#処理例

#受信したら破棄(/dev/null行き)
:0
* ^From .*@(hotmail\.com|aol\.com|email\.com)
/dev/null

#受信したら破棄 例 Free Money !! / Make your money などが題名にあれば破棄
:0
* ^Subject .*(free|making).*money.*
/dev/null

#受信したら破棄 例 @foo.barから来たtestという題名のメールを破棄
:0
* ^From .*@foo.bar
* ^Subject: test
/dev/null

#受信したら破棄 例 @foo.barから来たtestという題名以外のメールを破棄
:0
* ^From .*@foo.bar
* ! ^Subject: test
/dev/null

#題名がtestなら/usr/home/user/Mail/に保存
:0
* ^Subject: test
.

#題名がjoin-usなら/usr/home/user/Mail/join/に保存
:0
* ^Subject: join-us
join/.

#題名がinfoなら/usr/home/user/info.txtの内容を返信
#  同じ場所にinfo.txtという名前でテキストデータを用意する
#  /path/toはあなたのサーバのパスに入れ替えるのを忘れずに
#  user@mail.hostはあなたのメールアドレス
:0
* ^Subject: info
| (/path/to/formail -r -A"Precedence: junk" \
    -A"From: YOUR NAME <user@mail.host>" ;\
    cat /usr/home/user/info.txt) |\
    /path/to/sendmail -t

#-----------------------------------------------------------
#以下はA-Cいずれかを選ぶ(例)
#要するに、条件ラインを設定しなければすべてのメールが該当になる
#以上の設定をすべてクリア(該当しない)したメールをどうするかを最後に設定

#A /usr/home/user/info2.txtを送信
:0
| (/path/to/formail -r -A"Precedence: junk" \
    -A"From: YOUR NAME <user@mail.host>" ;\
    cat /usr/home/user/info2.txt) |\
    /path/to/sendmail -t

#B これら以外はすべてuser@anothor.hostに転送
:0
! user@anothor.host

#C 何も設定しなければ、これら以外はDEFAULTに入る
#(すなわち通常にメールソフトで受け取れる)

なお、procmailの存在を知ってから丸1日でやっとここまでできただけですので、 以上のこと以外を質問されてもわかりませんので、悪しからず。


最近多いウイルスメール。添付形式の特徴で判断して、届いた直後に削除してしう方法です。 主なメールソフトの添付ファイルは Content-Type: Multipart/Mixed; で送信されることが多いため、 友人知人からの添付メールで以下の設定でメール交換できなかったことは、とりあえずまだ1回もないため、 私的にはかなり実用的な設定です。私自体毎日メールが多いので、ウイルスメールがいくつもあると受信時間がかかるので、 来なくなった(正確には来た時点で削除する)ので、とても快適になりました。ご紹介しますが、 使うかどうかはあなたが決めてください。ウイルスメールも、メール本体は単なるテキストなので、 メモ帳などの何の機能もない簡易エディタで開いても問題ないので、メールソフトに外部エディタで開くような機能があれば、 メールのヘッダの部分を見て、何か特徴を捉えて自分で調整することもできますね。(2002/5/9 記す)

# ちょっと前に流行ったウイルス用
:0
* ^Content-Type: multipart/related;
/dev/null

# このところ毎日届くウイルス(題名が日本語で来たり一定でない厄介なウイルス)用
:0
* ^Content-Type: multipart/alternative;
/dev/null


Powered by CGI RESCUE(R)