Upload
azuma-kuniyuki
View
1.484
Download
4
Embed Size (px)
DESCRIPTION
YAPC::Asia Tokyo 2010で発表したスライド http://slidesha.re/cCC85N の改良版です。11/20のKansai.pm #13 Meeting in Kyotoで発表しました。
Citation preview
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)
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
自己紹介
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ なまえ = azumakuniyuki✏ しごと = サーバ管理者 > 10 年✏ しごと = プログラマー < 2⅛ 年✏ おうち = 上京区✏ ねっと = @azumakuniyuki✏ はてな = id:azumakuniyuki
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 かわのくつ
そうび
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
どうぐ
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
本題
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
YAPC::Asia Tokyo 2010で発表した内容の改訂版です
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
バウンスメールを処理、解析、蓄積、出力する専用システムを
作りました
Perlで
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
bounceHammer
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
bounceHammer?
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ ばうんすはんまーと読む✏ バウンスメール解析専用✏ 配信システムではない✏ 基本的にコマンドラインツール✏ Webの管理画面もあります
bouncehammer?
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
bounceMail?
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ エラーで返ってきたメール✏ 中身はだいたい英語✏ 日本語のものもある✏ リターンメール✏ 不達メール
bounce mail?
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/メーラーダエモン
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...✏メールサーバによっていろいろ
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
できることbounceHammerが
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ バウンスメールを解析する✏ バウンス理由特定(宛先不明/拒否...)✏ 宛先分類(携帯/Webメール/PC...)✏ 解析したらデータベースに蓄積✏ 解析済みデータはYAMLで出力
Can ...
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
バウンス理由bounceHammerが検出する
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ 宛先不明/ドメイン指定拒否✏ メールボックスいっぱい✏ メールが大きすぎる✏ セキュリティ的なエラー✏ 配送時間切れで差戻し✏ ほかいろいろ(16種類ぐらい)
Reasons
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
何の役に立つ?bounceHammerは
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ 一般的なMTAで配信している所✏ でもバウンス処理はしていない
✏ そこそこ沢山配信している所✏ でもバウンス処理はしていない
Where
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ コンテンツプロバイダさん✏ メールマガジンスタンドさん✏ メール配信しているところ全部✏ まだバウンス処理をしていない人
Who
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
放置すると...
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ 携帯宛はブロックされる → 困る✏ 有効配信数がわからない → 困る✏ 遅延で配信時間がかかる → 困る✏ 遅延でサーバが負荷上昇 → 困る
Block & Delay
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
とにかく困る
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
バウンス処理は
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ 確実にやるべき✏ 配信数が少なくてもやるべき✏ メール1通でも送るならやるべき
Bounce handling
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
処理をするとbounceHammerで
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ バウンスの理由が正確にわかる✏ バウンス記録を構造化して保存✏ ウェブ管理画面でアドレス管理✏ メール配信の合理化と健全化に✏ 自前でバウンス処理の実装不要
use bouncehammer;
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
動作環境bounceHammerの
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
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
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
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
構築bounceHammerの
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
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
動かすbounceHammerを
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
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
解析コマンドbounceHammerの
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*
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
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
出力コマンドbounceHammerの
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*
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
解析済データbounceHammerの
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ 解析済みデータはYAML || JSON✏ CSVでも出力できます✏ サーバでバウンスの照合→削除✏ 配信プログラムでバウンス照合✏ ウェブサイトでバウンスの照合
Parsed data
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
MTAと協調
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ たぶん一番手っ取り早い利用方法✏ 配信プログラムはいじりたくない✏ 配信側をいじる期間の確保が無理✏ でもバウンスした宛先に送るの嫌✏ バウンスした宛先はMTAが削除 !
at MTA
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
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
配信側で照合
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ たとえばユーザ宛にお知らせ送信✏ メール配信プログラムで宛先照合✏ YAMLで出力した宛先一覧を読む✏ 一致した宛先は送信対象から外す✏ YAMLが読めるなら言語を問わず
Read YAML
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
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
サイト上で照合
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
✏ HTTPベースのAPIを使う✏ ユーザ毎のページに状態を表示✏「登録されているアドレスは...」✏ 受け取れるアドレスに変更催促✏ JSONが読めるなら言語を問わず
use HTTP-API;
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 ){ 内容を取得; }
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
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
http://bouncehammer.jp/詳細はWebで
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周年記念号に載りました
Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd.bo
un
ce
Ha
mm
er
御静聴ありがとうございました・