はじめに
procmail とはメール受信時の振り分け、フィルタリングなどを行うためのメール処理プログラムです。
Procmailが使える環境なら、レシピを書くだけでメール受信時に好きなプログラムで自動処理することができます。
たとえば、こんなことに使えます。
− メールが届いた時に、お礼メールを自動応答をする
– メールが届いた時に、自動で他の誰かに転送する
– スパムメールを自動で捨てる
– メモを書いたメールを送ったら、内容をデータベースに保存してくれるシステム
– 添付画像つきメールを送ったら、添付画像を自分のサイトで公開するシステム
– 問い合わせメールを管理画面で見えて、そのままメール返信ができるシステム
– などなど。
とにかく、
「メールを特定のメールアドレスに送ったら○○が✕✕する」
という処理のきっかけ(開始地点)として、procmailが使えます。
使ってみる
Procmailを使うには、メールサーバに Procmail が入っていることが前提です。
メールサーバ構築方法についてこの記事では省略します。
たとえばメールサーバとしてPostfixを使う場合は、以下の記事を参考にしてください。
この記事ではProcmailインストール方法はCentOS(RedHat Linux)、Postfixを使った場合の説明をします。
利用方法はOSによらず共通です。
procmailをインストールする
which procmail
とたたいて、 /usr/local/bin/procmail のように、パスがかえってくればOKです。
パスが何も結果がかえってこなければ、
sudo yum install -y procmail
と実行してインストールします。
インストールしたら、Postfixの設定ファイル main.cf の、mailbox_command設定を探して、以下のように追記します。
mailbox_commandが見つからなければ、main.cfのどこに入れてもOKです。
/etc/postfix/main.cf:
#mailbox_commandが並んでる最後の行に・・・
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
#mailbox_command = /usr/local/mybin/procmail_wrap
#↓これを追記する!
mailbox_command = /usr/bin/procmail
/usr/bin/procmail は、自分の環境で
witch procmail
として出てきたパスを入力してください。
procmailを使う準備
procmail のルールを書くためには、まずメール受信ユーザのホームディレクトリに
以下の内容をもつ .forward ファイルを作成します(両端のダブルクォーテーションも必要)。
"|IFS=' '&&exec procmailのフルパス -f-||exit 75 #ログインユーザ名"
例:
/home/john/.forward を追加する場合…
"|IFS=' ' && exec /usr/local/bin/procmail -f-||exit 75 #john"
最初と最後のダブルクオーテーションが無いと正しく動かず、超ハマるので注意してください。
procmailのルールを書く
次に同様に .procmailrc ファイルを作成します。
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/.procmail.lock
<h1>--- 例1:未承諾広告を捨てる</h1>
:0 H
* ^Subject:.<em>iso-2022-jp
* ^Subject:.</em>\/.*
* ? echo "$MATCH" | nkf -me | egrep '※未承諾広告'
/dev/null
<h1>--- 例2:エイリアスによる script@example.org 宛のメールの内容(ヘッダ含む)を /usr/local/bin/dosomething.sh に渡して実行する</h1>
:0
* ^To:.*script@example.org
| /usr/local/bin/dosomething.sh
例1はメールフィルタリングの例です。
例2はメールをトリガとして任意のプログラムを実行する例です。この例では、/usr/local/bin/dosomething.shにメールの内容を標準入力で渡して、実行しています。
このように好きなプログラムにメールヘッダ・本文を渡して実行することで、自動応答メール等様々な用途で利用できます。
補足
~/.forward がない場合は、main.cf の mailbox_command 変数で指定されたコマンド, mailbox_cmmand も指定されていない場合は通常のメール配送を行います。
また、procmail を実行した時に ~/.procmailrc がない場合も(procmail が)単純にメール配送を行います。
仮想ドメイン・仮想ユーザを使っているPostfixでProcmailを使う方法
仮想ドメインのメールボックスでは .forward ファイルおよび main.cf での mailbox_command は参照されないため、 procmail 等コマンド実行は適用されません。
このため、仮想ドメインのメールアドレスで procmail を扱うためには virtual_alias_maps で、procmailを使いたいメールアドレスのみ、ローカルのリアルユーザにエイリアス(紐付け)する必要があります。
例: foo@example.org 宛のメールをリアルユーザ mailuser で受け取る場合…
/etc/postfix/main.cf:
#...略...
#@localhost のみリアルユーザとする(仮想ドメインを含めないこと)
mydestination = localhost
#...略...
#仮想メールアカウントのエイリアス
virtual_alias_maps = hash:/etc/postfix/viatual
#仮想メールアカウントのメールボックス
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
/etc/postfix/virtual:
foo@example.com mailuser@localhost
/etc/postfix/virtual_mailbox_maps:
#(エイリアスしたものは含めません)
#example.com
info@example.com example.com/info
postmaster@example.com example.com/postmaster
root@example.com example.com/postmaster
#example.net
info@example.net example.net/info
postmaster@example.net example.net/postmaster
root@example.net example.net/postmaster
設定ファイルの書き換えが終わったら、設定を反映するため以下のコマンドを実行します。
su - # root ユーザで行う
cd /etc/postfix
postmap hash:virtual_mailbox_maps
postmap hash:virtual
postfix reload
あとは前述のとおり mailuser のホームディレクトリ(例: /home/mailuser/ )に .forward, .procmailrc を作成すれば、
foo@example.com に対して procmail のルールが書けるようになります。
参考:
Advanced Email Forwarding
Manpage of PROCMAILRC(JM Project による和訳)
Postfix 設定パラメータ
.procmailrc の書き方
Virtual環境での.forward が有効になりません(postfix-jp: 425)
Postfix 設定パラメータ