その昔、SoftwareDesign 2010年11月号 で見たメールのエラーリターンを管理する仕組み BounceHammer を2年の年月を隔てて試してみた。 オープンソースのバウンスメール解析システム BounceHammer:メール|gihyo.jp … 技術評論社 各社それぞれの思惑で実装されたエラーメールはそれはそれはバリエーションに富んでおり、これの Parser を書くのは大変骨の折れる作業だから、これはとてもありがたい。 これまで試さなかったのは、Perl のモジュール沢山いれるの嫌だなというのが原因なのと、一応それらしく動いているっぽい独自の仕組みが存在したから。でも誰もメンテしないのでなんか怪しくなってきた。そこで過去の記憶をたどり試してみることにした。 cpanm を覚えた今 ( いまさら cpanm ) となっては、インストールはとっても簡単。 CentOS 6 の /opt/bouncehammer にインストールする方法 Perl の Module 読み込みのための環境変数設定
$ echo "export PERL5OPT=\"-I~/bouncehammer/lib/perl5 -I~/bouncehammer/lib/perl5/$(perl -MConfig -e 'print $Config{archname}')\"" >> .bashrc
$ wget http://dist.bouncehammer.jp/bouncehammer-2.7.9.tar.gz
$ tar zxvf bouncehammer-2.7.9.tar.gz
$ cd bouncehammer-2.7.9
$ mkdir ~/bouncehammer
$ perl Modules.PL missing | awk '{print $4}' | cpanm -l ~/bouncehammer
$ ./configure --prefix=~/bouncehammer
$ make
$ make test
$ make install
DB は PostgreSQL にしておく (標準の yum のはいまだに 8.4 だけど)、MySQL でも OK
$ sudo yum install postgresql-devel postgresql-server
$ cpanm -l ~/bouncehammer DBD::Pg
$ sudo -u postgres initdb -E utf8 --locale=ja_JP.utf8 -D /var/lib/pgsql/data
$ sudo /sbin/chkconfig postgresql on
$ sudo /sbin/service postgresql start
$ sudo -u postgres createuser bouncehammer
$ sudo -u postgres createdb -E utf8 -O bouncehammer bouncehammer
$ cat ~/bouncehammer/share/script/PostgreSQL*.sql | psql -U bouncehammer bouncehammer
$ cat ~/bouncehammer/share/script/mastertable-*.sql | psql -U bouncehammer bouncehammer
BounceHammer 設定
$ cd ~/bouncehammer/etc
$ cp available-countries{-example,}
$ cp bouncehammer.cf{-example,}
$ touch neighbor-domains
$ cp webui.cf{-example,}
$ vi bouncehammer.cf
$ vi webui.cf
送信元メールアドレスの domain 登録
$ ~/bouncehammer/bin/tablectl --insert -ts --name example.com
確認
$ ~/bouncehammer/bin/tablectl --list -ts -Fa
.----------------------------------------------.
| SenderDomains |
+-----+---------------+-------------+----------+
| #ID | domainname | description | disabled |
+-----+---------------+-------------+----------+
| 1 | m3.com | | 0 |
| 2 | askdoctors.jp | | 0 |
'-----+---------------+-------------+----------'
メールの取り込みは fetchmail & procmail
$ sudo yum install fetchmail procmail
$ cat > ~/.fetchmailrc <<_EOD_
set no bouncemail
defaults
uidl
no mimedecode
keep
poll メールサーバー名
protocol pop3
user ユーザー名
password パスワード
smtphost localhost
mda /usr/bin/procmail
_EOD_
$ cat > ~/.procmailrc <<_EOD_
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOCKFILE=$HOME/procmail.lock
$LOGFILE=$HOME/procmail.log
_EOD_
メール受信
$ fetchmail --ssl
これでメールが ~/Maildir/new/ に溜まる (.fetchmailrc に keep と書いているため、メールサーバーからは削除しないので ~/.fetchids に受信済み UIDL が保存される) Web Interface は Apache + CGI (mod_perl も可能)
$ sudo yum install httpd
$ sudo cp ~/bouncehammer/share/script/bouncehammer.cgi /var/www/cgi-bin/
$ sudo cp ~/bouncehammer/share/script/api.cgi /var/www/cgi-bin/
$ sudo chmod 755 /var/www/cgi-bin/{bouncehammer,api}.cgi
$ sudo vi /var/www/cgi-bin/{bouncehammer,api}.cgi
use lib '/home/xxx/bouncehammer/lib';
↓
use lib qw(/home/xxx/bouncehammer/lib /home/xxx/bouncehammer/lib/perl5);
リターンメールを BounceHammer に登録
$ ~/bouncehammer/bin/mailboxparser -g --log ~/Maildir/new --remove
(~/bouncehammer/var/spool/ にデータが溜まる)
$ ~/bouncehammer/bin/logger -c --remove
(spool のデータから var/log/hammer.YYYY-MM-DD.log を生成)
$ ~/bouncehammer/bin/databasectl --update --today
(log/hammer.YYYY-MM-DD.log の当日分をDBに登録)
$ ~/bouncehammer/bin/databasectl --update --yesterday
(log/hammer.YYYY-MM-DD.log の前日分をDBに登録)
初回は全部登録させる
$ for f in ~/bouncehammer/var/log/*.log
do
~/bouncehammer/bin/databasectl --update $f
done
海外のMTAからのメールとか、ひどい実装のMTAが変なリターンメールを送ってくるから UTF-8 じゃねーよと言われてDBに登録できないことがあるのにちょっと対応が必要かな