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

Preview:

DESCRIPTION

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

Citation preview

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

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

Cubicroot Co. Ltd.@azumakuniyuki

自己紹介

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

自己紹介- Azuma, Kuniyuki- @azumakuniyuki- サーバ管理者(*BSD, Linux, 昔はSolarisも)- プログラマ(Perl,/bin/sh, たまにC,R)- 京都市中京区

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

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

メールサーバ管理者- Sendmail → Postfix → Sendmail(再)- /etc/sendmail.cf - CF(WIDE), cf, m4 - たまにルールセットを書く - 柔軟な処理ができる

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(最近、統計処理のため)

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@京都)

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

bounceHammer ?

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

bounceHammer- ばうんすはんまー- バウンスメール解析専用- 配信システムではない- コマンドラインツール+WebUI- Made by Perl, OpenSource!- 2010年春に公開

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

バウンスメール ?

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

バウンスメール- エラーで返ってきたメール- 中身はだいたい英語 - 稀に日本語で書いてる- リターンメールとか不達メール

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

From:- MAILER-DAEMON- Mail Delivery Subsystem- Mail Administrator- Postmaster@...

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- 配信エラー

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

バウンスした理由- 宛先不明(User Unknown)- メールボックスいっぱい(Mailbox full)- ドメイン指定拒否(携帯電話)- セキュリティ的な理由(スパム扱い, Virus)- DNS的な理由(逆引きない, SPFの不備)- 不明なホスト(サービス終了, ドメイン違う)- MTA管理者が怒ってる(行儀悪い配信)

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

メール本文- 英語で書いてる- エラーコードがあればよい- どれも似ている

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)

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

目視で見分ける2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

バウンスメールの処理

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

バウンス処理は- 確実にやるべき- 正確にやるべき- 配信数が少なくてもやるべき- メール1通でも送るならやった方がいい

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

バウンス処理を放置すると- 携帯宛はブロックされる - 遅延が発生する - 配信時間がかかる - メールサーバの負荷上昇- 有効配信数がわからない

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

放置した事例1- 携帯電話宛の宛先不明が多発 - 消し込み処理やらずに継続配信 - SMTP接続が拒否される(一時的) - 大規模な遅延が発生 - メールサーバの負荷上昇 - 別のIPアドレスでMTA構築(コスト↑)

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

放置した事例2- 宛先不明やMailbox Fullが多発 - 消し込み処理やらずに継続配信 - SMTP接続が拒否される(128IPs!) - DNSBLに登録された - 解除してもらうまで時間がかかる - 別のIPアドレスでMTA構築(コスト↑)

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

バウンス処理を実装する- たいへん- パターンが多い ← 正規表現たくさん書く - MTA毎に違う(Sendmail,Postfix,qmail,..) - 宛先毎に違う(Gmail,Yahoo!,Hotmail,…) - エラー毎に違う- 正しく解析すべき

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

雑に実装した事例- 簡単な一枚スクリプトで実装- エラーメールが返ってきたら無条件で削除 - 宛先不明ならそれでもOK - Mailbox Fullや一時エラーでも削除した - ユーザからクレーム - 「急にメールが来なくなった」

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

バウンス処理は- 確実にやるべき- 正確にやるべき- 配信数が少なくてもやるべき- メール1通でも送るならやった方がいい

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

bounceHammer- バウンスメールの解析専用- サーバで動く- コマンドラインツール- WebUI(ブラウザベースの管理画面)- HTTP-API(読み取り専用)- http://example.bouncehammer.jp/

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

使う利点- バウンスした理由が正確にわかる- バウンス記録を構造化して保存できる- ブラウザベースの管理画面でアドレス管理- メール配信の合理化と健全化- 自前でバウンス処理を実装しなくてよい

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

できること- バウンスメールの解析- エラーの理由を特定する - 宛先不明・拒否・容量超過(全19種類)- 宛先分類(携帯/スマホ/PC/Webメール)- YAML/JSON/CSVで結果を出力- DB(MySQL,PostgreSQL,SQLite)に保存

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

役立つ場面- オープンソースのMTAで配信している - Sendmail, Postfix, qmail, Exim, Courier- バウンス処理してない OR 緩い - あまり正確にやっていない- そこそこたくさん配信している - 配信数 > 100/Day

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

役立つ人々- コンテンツプロバイダ - 通知でメールが飛ぶ- メールマガジンスタンド- メール配信があるところ全部- まだバウンス処理していない人

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

bounceHammerのユーザ- 携帯向けポータルサイト(含BBS)- SNS(通知関係でメールが飛ぶ)- 転職サイト- オンラインショップ・通販- レンタルサーバ- 海外も少し

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

@type様- 国内最大級の転職サイト- キャリアデザインセンター様- @type, 女の転職@type- 150万Users(2010冬)- 配信数1200万通/月(2010冬)- 私の年収...

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

コマンドツールの機能

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・管理画面)

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

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から)

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/aliasesbounce: "| mailboxparser | databasectl --update"

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" } ]

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 | |'----+---------------------+-------------------------+-----------------------------------------------------------+---------+-------------'

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

解析結果を利用する- 解析結果はYAML(標準)かJSON- CSV出力にも対応(表計算ソフトで眺める)- MTAで利用(access.dbとか)- 配信プログラムで利用(消し込みとか)- サイトでバウンス照合 - 「○月○日に送ったメールはエラーで…」

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通/秒

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

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

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

出力結果の利用2配信プログラムに解析結果を処理させる$ datadumper > /tmp/bounce.yaml----------------------------------------------------------#!/usr/local/bin/perluse JSON::Syck;my @A = 配信対象のメールアドレス配列;my @B = JSON::Syck::LoadFile("/tmp/bounce.yaml");foreach my $e ( @A ){ unless( grep { $e eq $_->{recipient} } @B ){ バウンスの記録に一致しないので配信する処理; }}

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

管理画面(WebUI)の機能

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

ダッシュボード2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

検索結果2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

解析テスト2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

日々の更新記録2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

English2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

HTTP-APIの機能

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

HTTP-API- サイト側でアドレスの状態を確認- ユーザのページに表示させる - 「登録されているメールアドレスは…」 - 拒否設定解除を促す- JSONが読める言語ならなんでもOK

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

HTTP-APIで照合サイト側プログラムでバウンス照合#!/usr/local/bin/perluse 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 ){ 内容を取得; いろいろ処理; }

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

オープンソース以外のMTA

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

MTAは多種多様- オープンソースのMTA - ソースコードからエラーのパターンを取得- フリーのWebメールサービス - サンプル収集・帰納的- それ以外のMTAは? - Exchange, Lotus, MailFoundry, - Amazon SES, SendGrid,…

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

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種類対応- ライセンス販売

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

11/14(Mon)bouncehammer 2.7.7

Release

2011/11/12(Sat) / KANSAI OPEN SOURCE 2011/ bounceHammerによるバウンスメール解析の技術 / Cubicroot Co. Ltd. @azumakuniyuki

Recommended