違いの一覧

このページの表ではシシマイ(Perl版とRuby版)とbounceHammerの違い、 特にSisimaiの優位性を中心に説明しています。

解決した問題点

bounceHammerに存在する解決困難で深刻な問題点(Sisimaiにて解決済)について

詳しく

動作環境

シシマイ(Perl版とRuby版)の動作環境周りにおける違い (bounceHammerと比較して)

詳しく

解析性能

bounceHammerに対するSisimai (Perl版とRuby版)の性能における数値的な優位点について

詳しく

データ構造

SisimaibounceHammerでのデータ構造 (解析結果の構造、検出可能なバウンス理由)の違いについて

詳しく

解決した問題点

bounceHammerの最終版(v2.7.13)には解決困難で深刻な解析精度に関わる問題点が幾つかあり、 それらの問題を解決する為にSisimaiは開発されました。

一つのメールに2つ以上のバウンスがある場合

Perl
Ruby

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
                

Gmailのメールボックスにあるバウンスメール

Perl
Ruby

Sisimai(シシマイ)はGmailのメールボックスにあるバウンスメールも解析出来ます。 bounceHammerは古い形式のバウンスメールであればGmailのメールボックスにあるものでも 解析出来ますが、現在の形式のものは解析出来ません。


Status: 2.X.X

Perl
Ruby

SisimaiStatus: 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"
  },
                

Feedback Loop形式のメッセージ

Perl
Ruby

AOLYahoo! など海外のメールサービスでは導入されているARF(Abuse Reporting Format)形式のメールも Sisimaiでは解析可能です。

bounceHammerのFBL対応はあくまでも実験的実装で、完全にARF形式のメールを解析する事は できません。

動作環境

(Perl版とRuby版)の動作環境周りにおける違い (bounceHammerと比較して)は以下の通りです。

p5-sisimai(Perl) rb-sisimai(Ruby) bounceHammer
動作環境 Perl 5.26.0 - 5.38.2 Ruby 2.4.0 - 3.3.0 Perl 5.10.1 - 5.14
インストール方法 cpan, cpanm cpm gem configure; make; make install
コマンドラインツール なし なし あり
データベース なし なし あり(MySQL, PostgreSQL, SQLite)
管理画面 なし なし あり(WebUI)

SisimaiはPerlとRubyで動きます

Perl
Ruby

SisimaiはPerl 5.26.0以降で動作しますが bounceHammerPerl 5.16以降では動作しません。 ですので、例えばbounceHammerをインストールしようとしているサーバー のPerlが5.18であれば、古いバージョンのPerlを別途インストールする必要があります。

そして、 Sisimai v4.14.2からはSisimaiはPerlでもRuby(JRubyを含む) でも動作します。


インストールが簡単

Perl
Ruby

bounceHammerをインストールする作業はやや面倒で、 アーカイブのダウンロード・多くの依存モジュールのインストール・ configure, make, make test, make installコマンドの実行を経て完了します。

一方、Sisimaiのインストールはcpanmgemコマンドでインストールが 出来るので非常に簡単です。


コマンドラインツール・DBスキーマ・WebUI

Perl
Ruby

SisimaiにはbounceHammerbin/mailboxparserbin/databasectl のようなコマンドラインツールは無く、またWebUIやDBスキーマも持っていません。 あくまでもモジュールのみの軽量でシンプルな提供形態です。 数行のコードで解析できるようになるので、ユーザ側で好きなようにコマンドラインツールを実装してください、 または既存のシステムに組み込んで実装してください、という方針です。

解析性能

bounceHammerに対するSisimai (Perl版とRuby版)の性能における数値的な優位点については以下の通りです。

p5-sisimai(Perl) rb-sisimai(Ruby) bounceHammer
解析精度(2000通) 100% 100% 55%
商用MTAとESP対応モジュール あり(同梱) あり(同梱) 無し
解析速度(1000通) 1.5秒 3.2秒 4.3秒
依存モジュール数 2 1 24
ソースコード行数 11,800行 11,600行 18,200行
テスト件数 340,000件 423,000件 27000件

高い解析精度

Perl
Ruby

Sisimaiは内部に 73個のMTA/ESP用解析モジュール を持っているので、その解析精度はbounceHammerの約二倍を誇ります。 また、Microsoft Exchange ServerやIBM Notes and Dominoのような商用MTAや Amazon SESやWorkMail, SendGridのような商用メールサービスからのバウンスメール であってもSisimaiは解析する事が出来ます。


bounceHammerよりも高速

Perl
Ruby

Perl版SisimaibounceHammerbin/mailboxparser コマンドよりも2.0倍程度 高速にメールを解析し、構造化されたデータを生成します。

小さく堅牢

Perl
Ruby

Sisimaiはバウンスメールの解析のみに特化したライブラリですので、 以下のように小さく堅牢に設計されています。

  • bounceHammerの半分程度のソースコード行数
  • bounceHammerの5倍程度のテスト件数
  • 依存モジュールは2つだけ

データ構造

SisimaibounceHammerでのデータ構造 (解析結果の構造、検出可能なバウンス理由)の違いについては以下の通りです。

生成されたデータの各項目

Sisimaiが生成する解析データは、bounceHammerのそれと比べて より詳細な情報を保持しています。 Sisimaiが生成する解析結果の全項目は Sisimai::Factのデータ構造をご覧ください。

Perl
Ruby
項目名 Sisimai bounceHammer 補足
action OK - "failed", "expired", "delivered"
addresser OK OK 発信者アドレス
alias OK - 宛先メールアドレスのエイリアス
catch OK
(>= v4.19.0)
- フックメソッドの戻り値
deliverystatus OK OK
description/deliverystatus
D.S.Nの値(例:4.4.7)
destination OK OK 宛先メールアドレスのドメイン部分
diagnosticcode OK OK
description/diagnosticcode
バウンスメールのエラーメッセージや診断メッセージ
diagnostictype OK - エラーの種別
主にSMTPまたはX-Unix
feedbacktype OK - Feedback-Type:の値
abusefraud
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(34) OK(19) バウンス理由
recipient OK OK 受信者(宛先)のメールアドレス
replycode OK - "503""251"のようなSMTP応答コード
rhost OK - 宛先のメールサーバ名(ホスト名かIPアドレス)
senderdomain OK OK 発信者メールアドレスのドメイン部分
smtpagent OK OK
decription/smtpagent
解析する為に使用されたMTA/MSPモジュール名
smtpcommand OK - バウンスした際のSMTPコマンド名
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が検出可能なエラー理由の一覧と詳細は バウンス理由の一覧をご覧ください。

Perl
Ruby
バウンス理由 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
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
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