59
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer バウンスメールを自動解析するシステム bounceHammerというのを作りました Perl and eMail azumakuniyuki 株式会社キュービックルート Kansai.pm#13 in Kyoto, 2010/11/20(Sat)

Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Embed Size (px)

DESCRIPTION

YAPC::Asia Tokyo 2010で発表したスライド http://slidesha.re/cCC85N の改良版です。11/20のKansai.pm #13 Meeting in Kyotoで発表しました。

Citation preview

Page 1: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

バウンスメールを自動解析するシステムbounceHammerというのを作りました

Perl and eMail

azumakuniyuki株式会社キュービックルート

Kansai.pm#13in Kyoto, 2010/11/20(Sat)

Page 2: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

自己紹介

Page 3: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ なまえ = azumakuniyuki✏ しごと = サーバ管理者 > 10 年✏ しごと = プログラマー < 2⅛ 年✏ おうち = 上京区✏ ねっと = @azumakuniyuki✏ はてな = id:azumakuniyuki

Page 4: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

E PowerBookG4 E iPhone3GE NOKIA NM705i ふつうのぼうし わりときたないふく スニーカーE ふゆようのスーツE かわのくつ

そうび

Page 5: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

/usr/bin/perl -w /bin/sh /bin/tcsh OpenBSD Ubuntu MacVim /usr/bin/vi /usr/lib/sendmail LaTeX2e

どうぐ

Page 6: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

本題

Page 7: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

YAPC::Asia Tokyo 2010で発表した内容の改訂版です

Page 8: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

バウンスメールを処理、解析、蓄積、出力する専用システムを

作りました

Perlで

Page 9: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

bounceHammer

Page 10: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

bounceHammer?

Page 11: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ ばうんすはんまーと読む✏ バウンスメール解析専用✏ 配信システムではない✏ 基本的にコマンドラインツール✏ Webの管理画面もあります

bouncehammer?

Page 12: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

bounceMail?

Page 13: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ エラーで返ってきたメール✏ 中身はだいたい英語✏ 日本語のものもある✏ リターンメール✏ 不達メール

bounce mail?

Page 14: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

From:✏ Mailer-Daemon✏ Mail Delivery Subsystem✏ Mail Delivery System✏ Postmaster@...✏ だいたい↑のどれか

http://d.hatena.ne.jp/keyword/メーラーダエモン

Page 15: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

Subject:✏ Returned mail: see transcript ... ✏ failure notice✏ Undelivered Mail Returned to ...✏ Mail delivery failed: returning...✏メールサーバによっていろいろ

Page 16: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

できることbounceHammerが

Page 17: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ バウンスメールを解析する✏ バウンス理由特定(宛先不明/拒否...)✏ 宛先分類(携帯/Webメール/PC...)✏ 解析したらデータベースに蓄積✏ 解析済みデータはYAMLで出力

Can ...

Page 18: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

バウンス理由bounceHammerが検出する

Page 19: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ 宛先不明/ドメイン指定拒否✏ メールボックスいっぱい✏ メールが大きすぎる✏ セキュリティ的なエラー✏ 配送時間切れで差戻し✏ ほかいろいろ(16種類ぐらい)

Reasons

Page 20: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

何の役に立つ?bounceHammerは

Page 21: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ 一般的なMTAで配信している所✏ でもバウンス処理はしていない

✏ そこそこ沢山配信している所✏ でもバウンス処理はしていない

Where

Page 22: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ コンテンツプロバイダさん✏ メールマガジンスタンドさん✏ メール配信しているところ全部✏ まだバウンス処理をしていない人

Who

Page 23: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

放置すると...

Page 24: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ 携帯宛はブロックされる → 困る✏ 有効配信数がわからない → 困る✏ 遅延で配信時間がかかる → 困る✏ 遅延でサーバが負荷上昇 → 困る

Block & Delay

Page 25: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

とにかく困る

Page 26: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

バウンス処理は

Page 27: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ 確実にやるべき✏ 配信数が少なくてもやるべき✏ メール1通でも送るならやるべき

Bounce handling

Page 28: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

処理をするとbounceHammerで

Page 29: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ バウンスの理由が正確にわかる✏ バウンス記録を構造化して保存✏ ウェブ管理画面でアドレス管理✏ メール配信の合理化と健全化に✏ 自前でバウンス処理の実装不要

use bouncehammer;

Page 30: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

Page 31: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

Page 32: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

動作環境bounceHammerの

Page 33: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ LAMPならなんでも動く✏ Perl 5.8.1以上✏ *BSD, Linux, MacOS X✏ PostgreSQL, MySQL, SQLite✏ Apache(CGI, mod_perl2)

Environment

Page 34: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

対応MTAbounceHammerの

http://d.hatena.ne.jp/keyword/MTA

Page 35: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ Sendmail (たぶん商用も)✏ Postfix✏ qmail✏ Exim✏ Courier(近日対応予定)✏ OpenSMTPD(近日対応予定)

MTAs

Page 36: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

構築bounceHammerの

Page 37: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ Perlモジュールを入れる✏ /bin/sh ./configure && make✏ make test && make install✏ データベースの準備✏ 設定ファイルの編集

Build

Page 38: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

動かすbounceHammerを

Page 39: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ 解析はmbox || Maildir/を引数に✏ STDINからも読む(/etc/aliases)✏ /etc/crontabで定時処理させる✏ 必要に応じて解析済みデータ取得

Operation

Page 40: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

解析コマンドbounceHammerの

Page 41: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

# mailboxparser /var/mail/root

% mailboxparser ~/Maildir/cur ~/Maildir/new

% cat /var/mail/azuma | mailboxparser

- { "bounced": 1221728044, "addresser": "[email protected]", "recipient": "[email protected]", "senderdomain": "example.jp", "destination": "example.gov", "reason": "hostunknown", ... }

bin/mailboxparser*

Page 42: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ Linode512(Xeon L5520x4 2.27GHz, 512MB RAM)

✏ 約2000通のバウンスメールを解析✏ mbox = 約500通/秒✏ Maildir/ = 約200通/秒

Benchmark

Page 43: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

出力コマンドbounceHammerの

Page 44: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

% datadumper --howrecent 1y # 1年以内の記録

% datadumper --reason 'userunknown' # 宛先不明だけ

% datadumper --hostgroup 'cellphone' # 携帯だけ

% datadumper --format csv --destination gmail.com

✏ DBに蓄積された記録を出力✏ YAML, JSON, CSVで出力する✏いろいろ条件指定ができます

bin/datadumper*

Page 45: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

解析済データbounceHammerの

Page 46: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ 解析済みデータはYAML || JSON✏ CSVでも出力できます✏ サーバでバウンスの照合→削除✏ 配信プログラムでバウンス照合✏ ウェブサイトでバウンスの照合

Parsed data

Page 47: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

MTAと協調

Page 48: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ たぶん一番手っ取り早い利用方法✏ 配信プログラムはいじりたくない✏ 配信側をいじる期間の確保が無理✏ でもバウンスした宛先に送るの嫌✏ バウンスした宛先はMTAが削除 !

at MTA

Page 49: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

# cd /etc/mail

# datadumper --format csv --reason userunknown \

> | cut -d, -f3 | grep '@' \

> | sed 's/^/To:/g;s/$/ DISCARD/g' > ./access

# makemap hash access.db < access

✏ datadumperで解析結果を得る✏ DISCARDで宛先不明は破棄する

/etc/mail/access

Page 50: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

配信側で照合

Page 51: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ たとえばユーザ宛にお知らせ送信✏ メール配信プログラムで宛先照合✏ YAMLで出力した宛先一覧を読む✏ 一致した宛先は送信対象から外す✏ YAMLが読めるなら言語を問わず

Read YAML

Page 52: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

#!/usr/bin/perluse JSON::Syck;

my @A = 配信対象のメールアドレス配列;my @B = JSON::Syck::LoadFile("/tmp/bounce.yaml");foreach my $e ( @A ){ unless( grep { $e eq $_->{recipient} } @B ){ バウンス記録に一致しないので配信する; }}

# datadumper > /tmp/bounce.yaml

Page 53: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

サイト上で照合

Page 54: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ HTTPベースのAPIを使う✏ ユーザ毎のページに状態を表示✏「登録されているアドレスは...」✏ 受け取れるアドレスに変更催促✏ JSONが読めるなら言語を問わず

use HTTP-API;

Page 55: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

#!/usr/bin/perluse JSON::Syck;use LWP::UserAgent;

my $A = 'ユーザのメールアドレス';my $H = 'http://127.0.0.1/b.cgi/search/recipient/';my $U = new LWP::UserAgent();my $R = $U->request( HTTP::Request->new( GET => $H.$A ));my $J = JSON::Syck::Load( $R->content() ) || [];foreach my $e ( @$J ){ 内容を取得; }

Page 56: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

✏ なるべく国産モジュール使いたい✏ ORMは国産化完了(DBIC→Skinny)✏ CGI::Application::.+ → ? + ?✏ APIで書き込み可能にする✏ 商用MTA・アプライアンスに対応?

TODOs

Page 57: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

http://bouncehammer.jp/詳細はWebで

Page 58: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

http://gihyo.jp/magazine/SD

Software Design 2010年11月号創刊20周年記念号に載りました

Page 59: Perl and eMail at Kansai.pm #13 Meeting in Kyoto

Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo

un

ce

Ha

mm

er

御静聴ありがとうございました・