Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

1,819 views

Published on

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

  • Be the first to comment

  • Be the first to like this

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 御静聴あり がとうござ いました・

×