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

1,744 views

Published on

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

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,744
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. 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)
  2. 2. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 自己紹介
  3. 3. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ なまえ = azumakuniyuki ✏ しごと = サーバ管理者 > 10 年 ✏ しごと = プログラマー < 2⅛ 年 ✏ おうち = 上京区 ✏ ねっと = @azumakuniyuki ✏ はてな = id:azumakuniyuki
  4. 4. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer E PowerBookG4 E iPhone3G E NOKIA NM705i ふつうのぼうし わりときたないふく スニーカー E ふゆようのスーツ E かわのくつ そうび
  5. 5. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer /usr/bin/perl -w /bin/sh /bin/tcsh OpenBSD Ubuntu MacVim /usr/bin/vi /usr/lib/sendmail LaTeX2e どうぐ
  6. 6. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 本題
  7. 7. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer YAPC::Asia Tokyo 2010 で発表した内容の改訂版です
  8. 8. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer バウンスメールを処理、解析、 蓄積、出力する専用システムを 作りました Perlで
  9. 9. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer bounceHammer
  10. 10. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer bounceHammer?
  11. 11. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ ばうんすはんまーと読む ✏ バウンスメール解析専用 ✏ 配信システムではない ✏ 基本的にコマンドラインツール ✏ Webの管理画面もあります bouncehammer?
  12. 12. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer bounceMail?
  13. 13. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ エラーで返ってきたメール ✏ 中身はだいたい英語 ✏ 日本語のものもある ✏ リターンメール ✏ 不達メール bounce mail?
  14. 14. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer From: ✏ Mailer-Daemon ✏ Mail Delivery Subsystem ✏ Mail Delivery System ✏ Postmaster@... ✏ だいたい↑のどれか http://d.hatena.ne.jp/keyword/メーラーダエモン
  15. 15. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer Subject: ✏ Returned mail: see transcript ... ✏ failure notice ✏ Undelivered Mail Returned to ... ✏ Mail delivery failed: returning... ✏メールサーバによっていろいろ
  16. 16. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer できること bounceHammerが
  17. 17. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ バウンスメールを解析する ✏ バウンス理由特定(宛先不明/拒否...) ✏ 宛先分類(携帯/Webメール/PC...) ✏ 解析したらデータベースに蓄積 ✏ 解析済みデータはYAMLで出力 Can ...
  18. 18. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer バウンス理由 bounceHammerが検出する
  19. 19. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ 宛先不明/ドメイン指定拒否 ✏ メールボックスいっぱい ✏ メールが大きすぎる ✏ セキュリティ的なエラー ✏ 配送時間切れで差戻し ✏ ほかいろいろ(16種類ぐらい) Reasons
  20. 20. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 何の役に立つ? bounceHammerは
  21. 21. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ 一般的なMTAで配信している所 ✏ でもバウンス処理はしていない ✏ そこそこ沢山配信している所 ✏ でもバウンス処理はしていない Where
  22. 22. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ コンテンツプロバイダさん ✏ メールマガジンスタンドさん ✏ メール配信しているところ全部 ✏ まだバウンス処理をしていない人 Who
  23. 23. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 放置すると...
  24. 24. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ 携帯宛はブロックされる → 困る ✏ 有効配信数がわからない → 困る ✏ 遅延で配信時間がかかる → 困る ✏ 遅延でサーバが負荷上昇 → 困る Block & Delay
  25. 25. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer とにかく困る
  26. 26. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer バウンス処理は
  27. 27. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ 確実にやるべき ✏ 配信数が少なくてもやるべき ✏ メール1通でも送るならやるべき Bounce handling
  28. 28. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 処理をすると bounceHammerで
  29. 29. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ バウンスの理由が正確にわかる ✏ バウンス記録を構造化して保存 ✏ ウェブ管理画面でアドレス管理 ✏ メール配信の合理化と健全化に ✏ 自前でバウンス処理の実装不要 use bouncehammer;
  30. 30. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer
  31. 31. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer
  32. 32. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 動作環境 bounceHammerの
  33. 33. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ LAMPならなんでも動く ✏ Perl 5.8.1以上 ✏ *BSD, Linux, MacOS X ✏ PostgreSQL, MySQL, SQLite ✏ Apache(CGI, mod_perl2) Environment
  34. 34. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 対応MTA bounceHammerの http://d.hatena.ne.jp/keyword/MTA
  35. 35. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ Sendmail (たぶん商用も) ✏ Postfix ✏ qmail ✏ Exim ✏ Courier(近日対応予定) ✏ OpenSMTPD(近日対応予定) MTAs
  36. 36. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 構築 bounceHammerの
  37. 37. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ Perlモジュールを入れる ✏ /bin/sh ./configure && make ✏ make test && make install ✏ データベースの準備 ✏ 設定ファイルの編集 Build
  38. 38. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 動かす bounceHammerを
  39. 39. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ 解析はmbox ¦¦ Maildir/を引数に ✏ STDINからも読む(/etc/aliases) ✏ /etc/crontabで定時処理させる ✏ 必要に応じて解析済みデータ取得 Operation
  40. 40. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 解析コマンド bounceHammerの
  41. 41. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer # mailboxparser /var/mail/root % mailboxparser ~/Maildir/cur ~/Maildir/new % cat /var/mail/azuma | mailboxparser - { "bounced": 1221728044, "addresser": "user1@example.jp", "recipient": "domain-does- not-exist@example.gov", "senderdomain": "example.jp", "destination": "example.gov", "reason": "hostunknown", ... } bin/mailboxparser*
  42. 42. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ Linode512(Xeon L5520x4 2.27GHz, 512MB RAM) ✏ 約2000通のバウンスメールを解析 ✏ mbox = 約500通/秒 ✏ Maildir/ = 約200通/秒 Benchmark
  43. 43. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 出力コマンド bounceHammerの
  44. 44. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer % datadumper --howrecent 1y # 1年以内の記録 % datadumper --reason 'userunknown' # 宛先不明だけ % datadumper --hostgroup 'cellphone' # 携帯だけ % datadumper --format csv --destination gmail.com ✏ DBに蓄積された記録を出力 ✏ YAML, JSON, CSVで出力する ✏いろいろ条件指定ができます bin/datadumper*
  45. 45. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 解析済データ bounceHammerの
  46. 46. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ 解析済みデータはYAML ¦¦ JSON ✏ CSVでも出力できます ✏ サーバでバウンスの照合→削除 ✏ 配信プログラムでバウンス照合 ✏ ウェブサイトでバウンスの照合 Parsed data
  47. 47. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer MTAと協調
  48. 48. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ たぶん一番手っ取り早い利用方法 ✏ 配信プログラムはいじりたくない ✏ 配信側をいじる期間の確保が無理 ✏ でもバウンスした宛先に送るの嫌 ✏ バウンスした宛先はMTAが削除 ! at MTA
  49. 49. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer # 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
  50. 50. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 配信側で照合
  51. 51. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ たとえばユーザ宛にお知らせ送信 ✏ メール配信プログラムで宛先照合 ✏ YAMLで出力した宛先一覧を読む ✏ 一致した宛先は送信対象から外す ✏ YAMLが読めるなら言語を問わず Read YAML
  52. 52. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer #!/usr/bin/perl use 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
  53. 53. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer サイト上で照合
  54. 54. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ HTTPベースのAPIを使う ✏ ユーザ毎のページに状態を表示 ✏「登録されているアドレスは...」 ✏ 受け取れるアドレスに変更催促 ✏ JSONが読めるなら言語を問わず use HTTP-API;
  55. 55. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer #!/usr/bin/perl use 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 ){ 内容を取得; }
  56. 56. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer ✏ なるべく国産モジュール使いたい ✏ ORMは国産化完了(DBIC→Skinny) ✏ CGI::Application::.+ → ? + ? ✏ APIで書き込み可能にする ✏ 商用MTA・アプライアンスに対応? TODOs
  57. 57. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer http://bouncehammer.jp/ 詳細はWebで
  58. 58. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer http://gihyo.jp/magazine/SD Software Design 2010年11月号 創刊20周年記念号に載りました
  59. 59. Kansai.pm #13@京都 / Perl and eMail - bounceHammerっていうのを作りました / Developed by Cubicroot Co. Ltd. bounceHammer 御静聴あり がとうござ いました・

×