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.

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

6,025 views

Published on

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

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

×