FreeBSD/ProcMail

ProcMail

Procmailは電子メールの振り分けを行うのに便利なツールです。届いた電子メールを特定のものだけを他のアドレスに転送したり、
SPAMをフィルタリング(削除や移動)することなども可能です。
今回はvpopmailと連携して使う方法を記述します。

  1. 環境
  2. インストール
  3. .qmailの編集
  4. .procmailの編集
  5. procmailマニュアル
  6. DoCoMoからのメールを転送

環境

FreeBSD 6.0
procmail-3.22_6

インストール

# cd /usr/ports/mail/procmail/
# make install clean ;rehash


.qmailの編集

■vpopmailのユーザディレクトリが下記の状態だと仮定します。

/usr/local/vpopmail/domains/mydomain.com/hoge
※mydomain.com=ドメイン名
※hoge=ユーザ名

■.qmailによりprocmailに噛ませるように設定する。

# cat /usr/local/vpopmail/domains/mydomain.com/hoge/.qmail
| /usr/local/bin/procmail -m ./.procmailrc

.procmailの編集

■メールヘッダに「^X-Spam-Status: Yes」とあればSpamフォルダに移動
それ以外は、MAILDIRに移動という記述をする。
※他にもprocmailはFromによって、転送したりコピーしたり
 いろいろな使い方が出来る。vpopmailの場合ユーザへの編集環境を設定する必要がある。

# cat /usr/local/vpopmail/domains/mydomain.com/hoge/.procmail
PATH=/usr/bin:/bin:/usr/local/bin
HOME=/usr/local/vpopmail/domains/mydomain.comx/hoge
MAILDIR=$HOME/Maildir
DEFAULT=$HOME/Maildir/
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/procmail.lock
SPAM=$MAILDIR/.Spam/

# Move it to the "caughtspam" mbox if it was tagged as spam
:0
* ^X-Spam-Status: Yes
$SPAM

procmailマニュアル

ホームディレクトリに.procmailrc というファイルを置き、レシピを記述する事により設定を行います。
これには、複数のレシピを記述することができ、一つのレシピは「:0」で始まり、「:0」かファイル終端(EOF)で終わります。
また、行頭に "#"を記述することで、コメントを記述することもできます。

レシピには大別して3つの事を記述します。

フラグ    :Procmailにメッセージを渡す方法を指定 
条件文    :処理を行うメッセージを特定 
アクション  :条件に該当した場合に行う処理 

これとは別に、基本ヘッダというものがありますが、こちらで設定していますので特に記述する必要はありません。

フラグ

H    記述が省略された場合の動作。メッセージのヘッダだけを条件文に渡し、検査する。 
B    メッセージの本文だけを条件文に渡し、検査する。 
A    同じブロックレベルに記述されたAや、aの用いられてないレシピが該当した場合にだけ検査する。 
a    Aと同様だが、手前のレシピが正しく実行された場合にだけ検査する。 
E    Aの逆。手前のレシピが実行されなかった場合にだけ検査する。 
e    aの逆。手前のレシピが失敗した場合に検査する。 
h    アクション部にヘッダだけを渡す。 
b    アクション部にメッセージの本文だけを渡す。 
f    パイプをフィルタとみなす。つまり、前処理ができる。 
c    メッセージのコピーを残す。これがなければ、元のメール加工してしまうため、次の処理の為に必要である。
     また、転送する際にもコピーを残しておかなければ、メールは転送先にのみ残る。 
w    指定されたフィルタやプログラムが終了するまで待機し、処理に失敗した場合には検査を行わない。 
W    wと同じだが、処理に失敗しても検査する。 
i    あらゆる書きこみエラーを無視して検査する。 
hb   なにも書かない場合の動作。アクション部にメッセージのヘッダと本体の両方を渡す。 

条件文

!         条件の否定。条件を満たさなかった時に実行する。 
$         条件文に現れる環境変数をシェルの様に評価する。 
?         指定したプログラムの終了コードを利用する。(0:成功、1:失敗) 
<         長さが後に記述されたバイト数(10進)以上であれば実行する。 
>         長さが後に記述されたバイト数(10進)以下であれば実行する。 
変数名 ?? 指定された値と変数を比較する。 
\         クォートする。\/と記述することで該当個所を変数MATCHに格納する。 

アクション

!               指定されたアドレスに転送。スペースで区切る事により列挙可能。 
|               メッセージを他のプログラムに渡す。 
{..}            メッセージにあたらしい条件文を付加したい時や、
                複数のアクションを実行したいときにカッコでくくる。 
ファイル名       メッセージをファイルに格納する。ロック指定を忘れずに。 
ディレクトリ名   メッセージにユニークなファイル名をつけてディレクトリに格納。 
ディレクトリ名/. メッセージをディレクトリに連番形式で格納。 
/dev/null       メッセージを廃棄。復元不可。 

procmail設定例

■特定のメールアドレスからのメールを転送する。
この場合、@以下がgoodwill.com、ma21.ath.cxのメールとabc@docomo.ne.jpからのメールはhogehoge@ma21.ath.cxに転送されます。

:0
* ^From:.*(@goodwill.com|@ma21.ath.cx|abc@docomo.ne.jp)
! hogehoge@docomo.ne.jp

元のメールを残したまま転送したい場合には。
cオプションをつけておきます。

:0 c
* ^From:.*(@goodwill.com|@ma21.ath.cx|abc@docomo.ne.jp)
! hogehoge@docomo.ne.jp

DoCoMoからのメール転送

■携帯からのメールを転送する場合、Fromが送信者と違う為、迷惑メール対策でDoCoMoはなりすましメールとして[550 Unknown user ]で返されてしまいます。
※筆者はDoCoMoユーザの為、DoCoMoしか分かりません。
もしかしたら、AU、Vodafoneでも同じような事があるかも・・・

:0 c
* ^From:.*ABC@docomo.ne.jp
|grep -A50 'Content-Transfer-Encoding'|grep -v -E '(Content|X-Mailer)'|sed '1d'|mail -s 'ABCからメール' hogehoge@docomo.ne.jp

こんな感じで無理やり対応しました。