2014/11/11

次期bounceHammerの中核モジュール"Sisimai"

四ヶ月振りに書く記事です。

平成26年の冬ごろから開発をして、夏ごろに"Maikugi"って名前でリリースしようと思っていた次期 bounceHammer の中核となるモジュール部分ですが、方針を大幅に変更したりコードの大部分を書き換えたり、解析結果の形式を変更したりで、新たに"Sisimai(シシマイ)"という名前で世に出す事にしました、というか出しています。

モジュールとしての開発はある程度落ち着いた気がするので、纏めを目的とした覚書きと宣伝も予て一旦ブログに書いておくことにしました。

シシマイ?

Maikugiはbouncehammer version 3として開発していて、途中で実装方針を大幅に変える事になり、最初は別ブランチにして開発していたのですが、変更点が多すぎるのでbouncehammer version 4の中核モジュールとして別リポジトリに分離することにしました。

別リポジトリに分離するにはまた何か名前を考えないといけないので暫くアタマを捻った結果、以下のような感じでシシマイになりました。
  • モジュールとして開発するので"MAI: Mail Analyzing Interface"の文字を入れる
  • Version 4 = 4 = 四 = ""
  • "シ"と"MAI"が入る適当な単語は何かないか
  • シシマイって縁起が良さそう(獅子舞)
Shishimaiやと名前の文字数が長くなるのでSisimaiにしました。bouncehammerのモジュール部分なので金槌関係の名前にしようとか思っていた時期もありましたが、"bounceHammer"ってある程度は知られてそうな表向きの名前があるのでモジュール名はなんでもいいかって事で関係のない"シシマイ"になりました。

bounceHammer ver.2.7との違い

bouncehammer 2.7系でどうしても解決出来ない(するのに時間がかかりすぎる)問題をどうにかするのに、心機一転、一から開発し直す事にしたのがSisimaiです。

コマンドラインツールは無い

SisimaiにはbounceHammerのbin/mailboxparserbin/databasectlのようなコマンドラインツールはありません。あくまでモジュールのみです。数行のコードで解析できるようになるので、ユーザ側で好きなようにコマンドラインツールを実装してください、という方針です。

Perl 5.16以上でも動く

use base '...';を使っているので、bouncehammer 2.7系はPerl 5.10〜5.14のみでしか動きません。use parentに書き換えると今古めのPerlで動いているところがアップグレードによって動作しなくなるので、bounceHammer 2.7系はこのままuse baseで行きます。

Sisimaiは新しいuse parentを使っているので、Perl 5.10〜5.20までは動く事を確認しています。

商用MTAのバウンスメールも解析出来る

Microsoft Exchange ServerやIBM DominoにAmazonSESSendGrid他商用MTAやアプライアンス、サービスが作ったバウンスメールも標準で解析出来ます。

Sisimai::MTASisimai::MSP以下の名前空間にそれぞれのMTA用モジュールを実装していますので、モジュールを追加すると標準対応していないMTAが作ったバウンスメールでも解析可能になります。

開発者の視点で著名なところは実装済で、10個程が商用MTA系統のモジュールです。とはいえ商用MTAやアプライアンスを全部導入してバウンスメールを作るのは大変なので、開発するのに充分なサンプルが手に入ったら追加していく方針です。

DBは非対応

Sisimaiにはデータベース対応コードは入れていません。バウンスメールを解析してJSON形式に変換する事だけを行います。UNIXという考え方でいう「第三のシステム」です。

解析結果をDBに入れる必要があるなら、開発元が用意したDB回りのツールを使うよりも、ユーザ側で適切なテーブルを作って解析結果のJSONをDBに入れるコードを書いた方が良いと思います。

1メールに2件以上のバウンスがあっても解析出来る

最も解決したかった問題の一つで、1メールに2件以上のバウンスが入っている場合の処理です。bounceHammer 2.7系では最初の一件しか宛先メールアドレスを取得出来ませんでしたが、Sisimaiでは全て取得出来るようになりました。

1メールに2件以上のバウンスが入っているというのは、例えばTo: shironeko@example.jp, kijitora@example.jp のようなメールを送って両方がバウンスした場合に発生し、1通のバウンスメールに2件分が纏まって返ってきます。

解析精度

手元にあるSisimaiのmake test用に用意した800通程度のサンプルを、Sisimaiは全て解析出来るように実装しています。同じサンプルをbounceHammer 2.7系で解析すると95%程度の解析精度です。商用MTAや商用アプライアンスのメールも標準で解析出来る点を考えると、Sisimaiの方が遥かに高精度で解析出来ます。

Feedback Loop(ARF)形式のメールも解析可能

AOLYahoo!など海外のメールサービスでは導入されているARF(Abuse Reporting Format)形式のメールもバウンスメールとして扱うべきという問合せを以前に貰って、bounceHammer 2.7系で実験的に実装していたのですが、ようやく正式な実装としてSisimaiに入れました。

宛先ドメインによる分類はしない

bounceHammer 2.7系ではバウンスした宛先メールアドレスのドメイン部分に応じて、pc,web,smartphone等の分類google,microsoft,yahoo等のサービス名での分類をしていました。

しかし、そのドメインが何のサービスで使われているか調べるのが手間、携帯端末でもスマートフォンでもWebメールでも確認出来るメールアドレスのドメインを分類する意味が無くなった、という理由で、Sisimaiでは分類項目自体を廃止しました。

分類が必要な場合は、解析結果のドメイン部分を読み取ってコードを書けば目的は果たせるので、こちらで押しつけがましい実装をしなくても良いと思ったからです。

CPANにあってcpanmでインストール出来る

Sisimaiに名称変更してからCPANにもアップロードしていますので、cpanm Sisimai を実行すればモジュールがインストール出来るようになりました。

依存モジュールが少なくなった(24個→3個)

依存モジュールが依存している数は入れていませんが、Sisimaiは次の三つだけに依存しています。
bounceHammer 2.7系は解析以外にもファイルの統合やDB操作、WebUIも実装していましたので、依存モジュールがどうしても多くなりがちでしたが、解析だけに特化したSisimaiでは結果的に少なくなりました。

あと、bounceHammer 2.7系で使っているDBIx::SkinnyとCGI::Applicationがもうメンテナンスされていないので、別モジュールに差替える手間を惜しんだ事情もあります。

二条項BSDライセンス

GPLv2はやめました。FreeBSDから入ってOpenBSDに至っているのでBSDの名前を冠するライセンスの方が故郷感があります。

上記以外にも、自分が使う時や開発案件で組み込む時に、例えばDBは不要で解析結果だけをCSVで特定のディレクトリに書きだすだけで充分な場合、bouncehammer全体をインストールして沢山の依存モジュールをインストールするのが大げさすぎる、合理性に欠けると思っていた点もモジュールとして開発し直した理由です。

use Sisimai;

githubREADME.mdにも簡単な使い方を書いていますが、use Sisimai;をして数行のコードを書くと引数に指定したメールを解析出来ます。
解析結果のオブジェクトのdump('json')を実行すると次のようなJSONで出力されます。
上記のフォーマットはbounceHammer 2.7系とは異なります。現在、Sisimaiはversion 4.1.1ですが、この解析結果のフォーマットが変わる場合は4.2.0とか4.3.0とかバージョン番号の二番目の数字が大きくなる予定です。

bounceHammer 4

年内にbouncehammer 4としてリリースする予定ですが、中身は「Sisimai + 解析コマンド + 適当なインストーラ」になる予定です。

解析コマンド(bounceHammer 2.7系のmailboxparserに相当)を前述のサンプルのように自分で実装する場合はcpanm Sisimaiをしてコードを書くだけでOKです。

あと、現在公開中の2.7系は今月か来月に最新版の2.7.13をリリースします。今後はSisimaiで改善した精度の後方移植を周とした開発になる予定です。

Perl以外の言語

Sisimaiをインストールして適当な解析コマンドを作るか、bounceHammer ver.4をインストールして付属の解析コマンドを使うかのいずれかでバウンスメールを解析するという目的は達成出来るので、Perl以外の言語から解析を実行するのはあまり必要ないかなぁと考えています。

可能性があるとすれば、HTTP経由で解析が出来るAPIを用意するか、PHP版とかRuby版とかを移植で作るか、ですが、前者は適当なマシンにPerlとSisimaiを入れてローカルディスクにあるメールを解析すればいいものをわざわざ重いHTTPを使うという合理性に欠ける状態な気がしますし、後者は移植が大変そうという所感です。

Windowsでmake testが通らない以外はある程度完成しているので、他言語の勉強がてら移植をしても良いかなぁという気はしないでもないですが。

もっとサンプルがあると捗ります

リポジトリのeg/ディレクトリにはmake testでも使用するサンプルとしてのバウンスメールを幾つか入れています。こういった解析系モジュールは以下に多くのサンプルを集められるかが精度にかかわってきます。

商用MTAやアプライアンス、サービスが作ったバウンスメールや解析出来なかったエラーメールを、もしも手元にお持ちで外に出しても問題ない場合、メールアドレスやIPアドレス、元メールの本文等機密に当たる部分を適当なものに変更して、Issuesに書いて頂くか、メールか何かで頂けると助かります。

もし頂いたサンプルをリポジトリに入れる場合は、機密情報にあたりそうな部分をこちらで適当に変えて入れます。

以上のような感じで、Sisimaiおよびbouncehammer 4はエラーメール解析の世界標準を目指して開発が進んでいます。

No comments:

Post a Comment