このページの表ではシシマイ(Perl版とRuby版とGo版)とbounceHammerの違い、 特にSisimaiの優位性を中心に説明しています。
bounceHammerの最終版(v2.7.13)には解決困難で深刻な解析精度に関わる問題点が幾つかあり、 それらの問題を解決する為にSisimaiは開発されました。
Sisimai(シシマイ)は下記のような 2件以上のバウンス記録を含む単一のメール から全ての受信者アドレスとエラー理由を検出する事が出来ます。 bounceHammerは最初の一件のみ検出可能です。
Content-Type: message/delivery-status Reporting-MTA: dns; nijo.example.jp Received-From-MTA: DNS; smtp-gateway.kyoto.ocn.ne.jp Arrival-Date: Wed, 26 Feb 2014 06:05:47 -0500 Final-Recipient: RFC822; userunknown@example.org Action: failed Status: 5.1.1 Remote-MTA: DNS; mx.example.org Diagnostic-Code: SMTP; 550 5.1.1... User Unknown Last-Attempt-Date: Wed, 26 Feb 2014 06:05:48 -0500 Final-Recipient: RFC822; filtered@example.com Action: failed Status: 5.2.1 Remote-MTA: DNS; mx.example.com Diagnostic-Code: SMTP; 550 5.2.1 ... User Unknown Last-Attempt-Date: Wed, 26 Feb 2014 06:05:48 -0500 --s1QB5ma0018057.1393412748/nijo.example.jp Content-Type: message/rfc822
Sisimai(シシマイ)はGmailのメールボックスにあるバウンスメールも解析出来ます。 bounceHammerは古い形式のバウンスメールであればGmailのメールボックスにあるものでも 解析出来ますが、現在の形式のものは解析出来ません。
SisimaiはStatus: 2.1.5のような行を含むバウンスメール( rfc3464-28.eml ) を正しく解析し、バウンス理由を"delivered"として決定します。 しかし、 bounceHammerはこのようなメールを解析出来るものの、下記の出力例のように、 バウンス理由を"undefined"に決定してしまいます。
{
"token": "0ac0d79df3cc8ef4fc606334af840330",
"description": {
"timezoneoffset": "+0900",
"subject": "Nyaaan",
"smtpagent": "",
"messageid": "<20151025071802.22CC00222233@neko-222-2222.vs.example.ne.jp>",
"listid": "",
"diagnosticcode": "smtp; 250 2.1.5 Ok",
"deliverystatus": "2.1.5"
},
"frequency": 1,
"bounced": 1430318085,
"addresser": "root@neko-222-2222.vs.example.ne.jp",
"recipient": "kijitora@neko.example.jp",
"senderdomain": "neko-222-2222.vs.example.ne.jp",
"destination": "neko.example.jp",
"reason": "undefined",
"hostgroup": "reserved",
"provider": "reserved"
},
(Perl版とRuby版とGo版)の動作環境周りにおける違い (bounceHammerと比較して)は以下の通りです。
SisimaiはPerl 5.26.0以降で動作しますが bounceHammerはPerl 5.16以降では動作しません。 ですので、例えばbounceHammerをインストールしようとしているサーバー のPerlが5.18であれば、古いバージョンのPerlを別途インストールする必要があります。
そして、 Sisimai v4.14.2からはSisimaiはPerlでもRuby(JRubyを含む) でも、v5.2.0からはGoでも動作します。
bounceHammerをインストールする作業はやや面倒で、 アーカイブのダウンロード・多くの依存モジュールのインストール・ configure, make, make test, make installコマンドの実行を経て完了します。
一方、Sisimaiのインストールはcpanmやgemやgo get コマンドでインストールが出来るので非常に簡単です。
SisimaiにはbounceHammerのbin/mailboxparserやbin/databasectl のようなコマンドラインツールは無く、またWebUIやDBスキーマも持っていません。 あくまでもモジュールのみの軽量でシンプルな提供形態です。 数行のコードで解析できるようになるので、ユーザ側で好きなようにコマンドラインツールを実装してください、 または既存のシステムに組み込んで実装してください、という方針です。
bounceHammerに対するSisimai (Perl版とRuby版)の性能における数値的な優位点については以下の通りです。
| p5-sisimai | rb-sisimai | go-sisimai | bounceHammer | |
|---|---|---|---|---|
| 解析精度(2000通) | 100% | 100% | 100% | 55% |
| 商用MTAとESP対応モジュール | あり(同梱) | あり(同梱) | あり(同梱) | 無し |
| 解析速度(1000通) | 1.37秒 | 1.95秒 | 0.37秒 | 4.3秒 |
| 依存モジュール数 | 2 | 1 | 2 | 24 |
| ソースコード行数 | 9,700行 | 9,700行 | 8,700行 | 18,200行 |
| テスト件数 | 320,000件 | 410,000件 | 241,000件 | 27000件 |
Sisimaiは内部に 59個のMTA/ESP用解析モジュール を持っているので、その解析精度はbounceHammerの約二倍を誇ります。 また、Microsoft Exchange ServerやIBM Notes and Dominoのような商用MTAや Amazon SESやWorkMail, SendGridのような商用メールサービスからのバウンスメール であってもSisimaiは解析する事が出来ます。
Perl版SisimaiはbounceHammerのbin/mailboxparser コマンドよりも3.0倍程度、Go版Sisimai では12.2倍ぐらい 高速にメールを解析し、構造化されたデータを生成します。
Sisimaiはバウンスメールの解析のみに特化したライブラリですので、 以下のように小さく堅牢に設計されています。
SisimaiとbounceHammerでのデータ構造 (解析結果の構造、検出可能なバウンス理由)の違いについては以下の通りです。
Sisimaiが生成する解析データは、bounceHammerのそれと比べて より詳細な情報を保持しています。 Sisimaiが生成する解析結果の全項目は Sisimai::Factのデータ構造をご覧ください。
| 項目名 | Sisimai | bounceHammer | 補足 |
|---|---|---|---|
| action | OK | - | "failed", "expired", "delivered" |
| addresser | OK | OK | 発信者アドレス |
| alias | OK | - | 宛先メールアドレスのエイリアス |
| catch |
OK (>= v4.19.0) |
- | フックメソッドの戻り値 |
| command | OK | - | バウンスした際のSMTPコマンド名 |
| decodedby | OK |
OK decription/smtpagent |
解析する為に使用されたMTA/MSPモジュール名 |
| deliverystatus | OK |
OK description/deliverystatus |
D.S.Nの値(例:4.4.7) |
| destination | OK | OK | 宛先メールアドレスのドメイン部分 |
| diagnosticcode | OK |
OK description/diagnosticcode |
バウンスメールのエラーメッセージや診断メッセージ |
| diagnostictype | OK | - |
エラーの種別 主にSMTPまたはX-Unix |
| feedbackid | OK | - | 元メールのFeedback-ID:の値 |
| feedbacktype | OK | - |
Feedback-Type:の値 abuseやfraud等 |
| frequency | - | OK | バウンスした回数ですが解析済データでは常に1です。 この項目はDB用に存在します。 |
| hardbounce | OK | - | ハードバウンスであるかどうかを示す値です。 Sisimai 5.0.0で実装されました。 |
| hostgroup | - | OK | 宛先メールアドレスのドメインによる大分類項目です |
| lhost | OK | - | 発信に使用されたメールサーバ名(ホスト名かIPアドレス) |
| listid | OK |
OK description/listid (>= v2.7.10) |
List-Idの値、メーリングリスト名 |
| messageid |
OK Does not include >,< |
OK description/messageid (>= v2.7.11) Including > and < |
元メールのMessage-Id:ヘッダーの値です。 |
| provider | - | OK | 宛先メールアドレスの小分類(所属) |
| reason | OK(36) | OK(19) | バウンス理由 |
| recipient | OK | OK | 受信者(宛先)のメールアドレス |
| replycode | OK | - | "503"や"251"のようなSMTP応答コード |
| rhost | OK | - | 宛先のメールサーバ名(ホスト名かIPアドレス) |
| senderdomain | OK | OK | 発信者メールアドレスのドメイン部分 |
| softbounce | OK | - | Sisimai 5.0.0で廃止になりました |
| subject | OK |
OK description/subject (>= v2.7.11) |
元メールの件名 |
| timestamp | OK |
OK bounced |
バウンスした日時 |
| timezoneoffset | OK |
OK description/timezoneoffset |
バウンスした日時のタイムゾーン(時差) |
| token |
OK including timestamp |
OK generated from a sender and a recipient only) |
バウンス記録を識別する固有文字列 |
Sisimaiが検出可能なエラー理由の一覧と詳細は バウンス理由の一覧をご覧ください。
| バウンス理由 | Sisimai | bounceHammer | 解析結果での値 |
|---|---|---|---|
| Auth Failure | OK | - | authfailure |
| Bad Reputation | OK | - | badreputation |
| Blocked | OK | - | blocked |
| Content Error | OK |
OK contenterr |
contenterror |
| Delivered |
OK (>= v4.16.0) |
- |
delivered Option |
| Exceed Limit | OK | OK | exceedlimit |
| Expired | OK | OK | expired |
| Failed STARTTLS | OK | - | failedstarttls |
| Feedback | OK | - | feedback |
| Filtered | OK | OK | filtered |
| Has Moved | OK | OK | hasmoved |
| Host Unknown | OK | OK | hostunknown |
| Mailbox Full | OK | OK | mailboxfull |
| Mailer Error | OK | OK | mailererror |
| Mesg Too Big | OK | OK | mesgtoobig |
| Network Error |
OK (>= v4.1.12) |
- | networkerror |
| No Relaying | OK | - | norelaying |
| Not Accept | OK | OK | notaccept |
| Not Compliant RFC | OK | - | notcompliantrfc |
| On Hold | OK | OK | onhold |
| Policy Violation |
OK (>= v4.22.0) |
- | policyviolation |
| Rejected | OK | OK | rejected |
| RequirePTR | OK | - | requireptr |
| Security Error | OK |
OK securityerr |
securityerror |
| Spam Detected |
OK (>= v4.1.25) |
- | spamdetected |
| Speeding | OK | - | speeding |
| Suspend | OK | OK | suspend |
| Suppressed | OK | - | suppressed |
| Syntax Error |
OK (>= v4.17.0) |
- | syntaxerror |
| System Error | OK | OK | systemerror |
| System Full | OK | OK | systemfull |
| Too Many Conn |
OK (>= v4.1.26) |
- | toomanyconn |
| Undefined | OK | OK | undefined |
| User Unknown | OK | OK | userunknown |
| Vacation |
OK (>= v4.1.28) |
- | vacation Option |
| Virus Detected |
OK (>= v4.22.0) |
- | virusdetected |