KOF 2011 bounceHammerによるバウンスメール解析の技術

5,756 views

Published on

オープンソースで公開中のbouncehammerを使ったバウンスメール処理を解説します。システムの概要、SMTPとバウンスメール、導入事例を紹介。

1 Comment
6 Likes
Statistics
Notes
No Downloads
Views
Total views
5,756
On SlideShare
0
From Embeds
0
Number of Embeds
69
Actions
Shares
0
Downloads
10
Comments
1
Likes
6
Embeds 0
No embeds

No notes for slide

KOF 2011 bounceHammerによるバウンスメール解析の技術

  1. 1. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki bounceHammerによる バウンスメール解析の技術 Cubicroot Co. Ltd. @azumakuniyuki
  2. 2. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 自己紹介
  3. 3. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 自己紹介 - Azuma, Kuniyuki - @azumakuniyuki - サーバ管理者(*BSD, Linux, 昔はSolarisも) - プログラマ(Perl,/bin/sh, たまにC,R) - 京都市中京区
  4. 4. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki サーバ管理者 - FreeBSD(98) → FreeBSD 4.9→ OpenBSD - NetBSDは未経験 - 最近はLinuxが殆ど - CentOS, Fedora, RHEL, Ubuntu
  5. 5. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki メールサーバ管理者 - Sendmail → Postfix → Sendmail(再) - /etc/sendmail.cf - CF(WIDE), cf, m4 - たまにルールセットを書く - 柔軟な処理ができる
  6. 6. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki プログラマ - Perl (2008年秋からモダンPerlを勉強) - /bin/sh (サーバでの処理は殆ど) - C(学生時代少し) ←殆ど知らない - Java(JDK 1.0, 1.1の頃) - PHP(PHP/FIの頃, 2.0, 3.0) - R(最近、統計処理のため)
  7. 7. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki Perl - /bin/shで書きにくい場合はPerl - 2008年秋からモダンPerlを勉強 - モダンPerl入門+CPANモジュールガイド - YAPC::Asia - Kansai.pm(→11/26@京都)
  8. 8. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki bounceHammer ?
  9. 9. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki bounceHammer - ばうんすはんまー - バウンスメール解析専用 - 配信システムではない - コマンドラインツール+WebUI - Made by Perl, OpenSource! - 2010年春に公開
  10. 10. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki バウンスメール ?
  11. 11. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki バウンスメール - エラーで返ってきたメール - 中身はだいたい英語 - 稀に日本語で書いてる - リターンメールとか不達メール
  12. 12. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki From: - MAILER-DAEMON - Mail Delivery Subsystem - Mail Administrator - Postmaster@...
  13. 13. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki Subject: - Returned mail: see transcript for … - failure notice - Undelivered Mail Returned to … - Delivery Failure - 配信エラー
  14. 14. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki バウンスした理由 - 宛先不明(User Unknown) - メールボックスいっぱい(Mailbox full) - ドメイン指定拒否(携帯電話) - セキュリティ的な理由(スパム扱い, Virus) - DNS的な理由(逆引きない, SPFの不備) - 不明なホスト(サービス終了, ドメイン違う) - MTA管理者が怒ってる(行儀悪い配信)
  15. 15. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki メール本文 - 英語で書いてる - エラーコードがあればよい - どれも似ている
  16. 16. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 例) @docomo.ne.jp - Sendmail経由でDoCoMoに送った場合 - 本文はほとんど同じ 宛先不明 ドメイン指定拒否 ← エラーコード(D.S.N.)が少し違う → (reason: 550 Unknown user ****@docomo.ne.jp)
  17. 17. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 目視で見分ける
  18. 18. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki バウンスメールの処理
  19. 19. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki バウンス処理は - 確実にやるべき - 正確にやるべき - 配信数が少なくてもやるべき - メール1通でも送るならやった方がいい
  20. 20. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki バウンス処理を放置すると - 携帯宛はブロックされる - 遅延が発生する - 配信時間がかかる - メールサーバの負荷上昇 - 有効配信数がわからない
  21. 21. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 放置した事例1 - 携帯電話宛の宛先不明が多発 - 消し込み処理やらずに継続配信 - SMTP接続が拒否される(一時的) - 大規模な遅延が発生 - メールサーバの負荷上昇 - 別のIPアドレスでMTA構築(コスト↑)
  22. 22. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 放置した事例2 - 宛先不明やMailbox Fullが多発 - 消し込み処理やらずに継続配信 - SMTP接続が拒否される(128IPs!) - DNSBLに登録された - 解除してもらうまで時間がかかる - 別のIPアドレスでMTA構築(コスト↑)
  23. 23. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki バウンス処理を実装する - たいへん - パターンが多い ← 正規表現たくさん書く - MTA毎に違う(Sendmail,Postfix,qmail,..) - 宛先毎に違う(Gmail,Yahoo!,Hotmail,…) - エラー毎に違う - 正しく解析すべき
  24. 24. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 雑に実装した事例 - 簡単な一枚スクリプトで実装 - エラーメールが返ってきたら無条件で削除 - 宛先不明ならそれでもOK - Mailbox Fullや一時エラーでも削除した - ユーザからクレーム - 「急にメールが来なくなった」
  25. 25. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki バウンス処理は - 確実にやるべき - 正確にやるべき - 配信数が少なくてもやるべき - メール1通でも送るならやった方がいい
  26. 26. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki
  27. 27. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki bounceHammer - バウンスメールの解析専用 - サーバで動く - コマンドラインツール - WebUI(ブラウザベースの管理画面) - HTTP-API(読み取り専用) - http://example.bouncehammer.jp/
  28. 28. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 使う利点 - バウンスした理由が正確にわかる - バウンス記録を構造化して保存できる - ブラウザベースの管理画面でアドレス管理 - メール配信の合理化と健全化 - 自前でバウンス処理を実装しなくてよい
  29. 29. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki できること - バウンスメールの解析 - エラーの理由を特定する - 宛先不明・拒否・容量超過(全19種類) - 宛先分類(携帯/スマホ/PC/Webメール) - YAML/JSON/CSVで結果を出力 - DB(MySQL,PostgreSQL,SQLite)に保存
  30. 30. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 役立つ場面 - オープンソースのMTAで配信している - Sendmail, Postfix, qmail, Exim, Courier - バウンス処理してない OR 緩い - あまり正確にやっていない - そこそこたくさん配信している - 配信数 > 100/Day
  31. 31. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 役立つ人々 - コンテンツプロバイダ - 通知でメールが飛ぶ - メールマガジンスタンド - メール配信があるところ全部 - まだバウンス処理していない人
  32. 32. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki bounceHammerのユーザ - 携帯向けポータルサイト(含BBS) - SNS(通知関係でメールが飛ぶ) - 転職サイト - オンラインショップ・通販 - レンタルサーバ - 海外も少し
  33. 33. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki @type様 - 国内最大級の転職サイト - キャリアデザインセンター様 - @type, 女の転職@type - 150万Users(2010冬) - 配信数1200万通/月(2010冬) - 私の年収...
  34. 34. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki コマンドツールの機能
  35. 35. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 動作環境 - Perl 5.8.8以上といくつかのモジュール - *BSD, Linux, MacOS X - MySQL, PostgreSQL, SQLite(保存用) - Apache(WebUI・管理画面) - IE以外のブラウザ(WebUI・管理画面)
  36. 36. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 対応MTA - オープンソースのMTA - Sendmail, Postfix, qmail, Exim, Courier - 将来対応→OpenSMTPD, Apache James - 国内携帯電話キャリア - NTT DoCoMo, au by KDDI, SoftBank - ユーザ数の多いWebメール - Gmail, Yahoo!, Hotmail, Facebook, AOL
  37. 37. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 解析処理(mailboxparser) - UNIX mbox, Maildir/, 複数指定可 - STDIN(パイプで) - /etc/aliasesから起動 - bounce: "|mailboxparser --log" - /etc/crontabから定時処理 - 解析できなかったものだけ保存(2.7.7から)
  38. 38. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 解析処理(mailboxparser) UNIX mboxを引数に # bin/mailboxparser /var/mail/hoge 2つのMaildir/を引数に $ bin/mailboxparser ~/Maildir/cur ~/Maildir/new $ cat /var/mail/fuga | bin/mailboxparser バウンスメール受信と解析・DB保存をリアルタイムに $ tail /etc/mail/aliases bounce: "| mailboxparser | databasectl --update"
  39. 39. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 解析結果(mailboxparser) JSON # bin/mailboxparser --format json /var/mail/piyo [ { "bounced": 2, "addresser": "bouncehammer@cubicroot.jp", "recipient": "nanashi-no- gombee@example.jp", "senderdomain": "cubicroot.jp", "destination": "example.jp", "reason": "userunknown", "hostgroup": "reserved", "provider": "reserved", "frequency": 1, "description": { "deliverystatus": "5.1.1", "diagnosticcode": "SMTP; 550 Invalid recipient: <nanashi-no-gombee@example.jp>", "smtpagent": "Sendmail", "timezoneoffset": "+0900" }, "token": "6b15f26a2069e07d3e09cf30a03ac12d" } ]
  40. 40. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 解析結果(mailboxparser) アスキーテーブル $ bin/mailboxparser --format asciitable ~/Maildir/cur +----+---------------------+-------------------------+-----------------------------------------------------------+---------+-------------+ | # | Date | Addresser | Recipient | Stat | Reason | +----+---------------------+-------------------------+-----------------------------------------------------------+---------+-------------+ | 1 | 2008/09/18 17:54:04 | user1@example.jp | domain-does-not-exist@example.gov | 5.1.2 | hostunknown | | 2 | 2009/04/28 08:17:47 | user2@example.jp | recipient-address-does-not-exist@docomo.ne.jp | 5.1.1 | userunknown | | 3 | 2009/03/05 06:28:12 | user3@example.jp | recipient-mailbox-is-full@docomo.ne.jp | 5.2.2 | mailboxfull | | 4 | 2008/09/17 22:25:40 | user4@example.jp | message-is-rejected-by-the-domain-fileters@docomo.ne.jp | 5.2.0 | filtered | | 5 | 2009/04/28 08:38:49 | user5@example.jp | this-message-excees-limit-5000kb@docomo.ne.jp | 5.3.4 | mesgtoobig | | 6 | 2008/12/08 11:04:57 | user@example.co.jp | this-user-does-not-exist-on-the-server@ezweb.ne.jp | 5.0.911 | userunknown | … +----+---------------------+-------------------------+-----------------------------------------------------------+---------+-------------+ | | | | Total | 37 | | ----+---------------------+-------------------------+-----------------------------------------------------------+---------+-------------
  41. 41. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 解析結果を利用する - 解析結果はYAML(標準)かJSON - CSV出力にも対応(表計算ソフトで眺める) - MTAで利用(access.dbとか) - 配信プログラムで利用(消し込みとか) - サイトでバウンス照合 - 「○月○日に送ったメールはエラーで…」
  42. 42. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 解析速度(mailboxparser) - Linode (Xeon L5520(4) 2.27GHz) - 512MB Memory - Ubuntu 10.4 LTS - UNIX mbox = 約500通/秒 - Maildir/ = 約200通/秒
  43. 43. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 出力(datadumper) 1年以内にバウンスした記録をYAMLで出力 $ bin/datadumper --howrecent 1y --format yaml 宛先不明でバウンスした記録をJSONで出力 $ bin/datadumper --reason userunknown --format json 携帯電話宛のバウンス記録をCSVで出力 $ bin/datadumper --hostgroup cellphone --format csv Gmail宛のバウンス記録を出力 $ bin/datadumper --destination gmail.com
  44. 44. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 出力結果の利用1 配信プログラムいじれない OR MTAに処理させたい # cd /etc/mail # data dumper --format csv --reason userunknown > | cut -d, -f3 | grep @ | sed > -e s/^/To:/g -e s/$/ DISCARD/g > ./access # make map hash access.db < access
  45. 45. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 出力結果の利用2 配信プログラムに解析結果を処理させる $ datadumper > /tmp/bounce.yaml ---------------------------------------------------------- #!/usr/local/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 ){ バウンスの記録に一致しないので配信する処理; } }
  46. 46. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 管理画面(WebUI)の機能
  47. 47. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki ダッシュボード
  48. 48. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 検索結果
  49. 49. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 解析テスト
  50. 50. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 日々の更新記録
  51. 51. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki English
  52. 52. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki HTTP-APIの機能
  53. 53. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki HTTP-API - サイト側でアドレスの状態を確認 - ユーザのページに表示させる - 「登録されているメールアドレスは…」 - 拒否設定解除を促す - JSONが読める言語ならなんでもOK
  54. 54. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki HTTP-APIで照合 サイト側プログラムでバウンス照合 #!/usr/local/bin/perl use JSON::Syck; use LWP::UserAgent; my $A = ユーザのメールアドレス; my $H = http://localhost/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 ){ 内容を取得; いろいろ処理; }
  55. 55. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki オープンソース以外のMTA
  56. 56. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki MTAは多種多様 - オープンソースのMTA - ソースコードからエラーのパターンを取得 - フリーのWebメールサービス - サンプル収集・帰納的 - それ以外のMTAは? - Exchange, Lotus, MailFoundry, - Amazon SES, SendGrid,…
  57. 57. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki
  58. 58. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 商用MTA・アプライアンス - Exchange, Lotus Notes/Domino, - MailFoundry, McAfee, m-FILTER, - Amazon SES, SendGrid,… 14種類対応 - ライセンス販売
  59. 59. 2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki 11/14(Mon) bouncehammer 2.7.7 Release

×