Skip to content

Latest commit

 

History

History
282 lines (232 loc) · 13.4 KB

README-JA.md

File metadata and controls

282 lines (232 loc) · 13.4 KB

License Coverage Status Ruby Gem Version

What is Sisimai

Sisimai(シシマイ)はRFC5322準拠のエラーメールを解析し、解析結果をデータ構造に 変換するインターフェイスを提供するRubyライブラリです。 github.com/sisimai/p5-sisimai で公開しているPerl版シシマイから移植しました。

Key features

  • エラーメールをデータ構造に変換
    • Rubyのデータ形式(HashとArray)とJSON(String)に対応
  • インストールも使用も簡単
    • gem install
    • git clone & make
  • 高い解析精度
    • 解析精度はbounceHammerの2倍
    • 68種類のMTA/MDA/ESPに対応
    • Feedback Loopにも対応
    • 29種類のエラー理由を検出

Setting Up Sisimai

System requirements

Sisimaiの動作環境についての詳細は Sisimai | シシマイを使ってみるをご覧ください。

Install

From RubyGems.org

$ sudo gem install sisimai
Fetching: sisimai-4.25.5.gem (100%)
Successfully installed sisimai-4.25.5
Parsing documentation for sisimai-4.25.5
Installing ri documentation for sisimai-4.25.5
Done installing documentation for sisimai after 6 seconds
1 gem installed

From GitHub

$ cd /usr/local/src
$ git clone https://github.com/sisimai/rb-sisimai.git
$ cd ./rb-sisimai
$ sudo make depend install-from-local
gem install bundle rake rspec coveralls
...
4 gems installed
bundle exec rake install
sisimai 4.25.5 built to pkg/sisimai-4.25.5.gem.
sisimai (4.25.5) installed.

Usage

Basic usage

下記のようにSisimaiのmake()メソッドをmboxかMaildirのPATHを引数にして実行すると 解析結果が配列で返ってきます。v4.25.6から元データとなった電子メールファイルへの PATHを保持するoriginが利用できます。

#! /usr/bin/env ruby
require 'sisimai'
v = Sisimai.make('/path/to/mbox')       # or path to Maildir/

# Beginning with v4.23.0, both make() and dump() method of Sisimai class can
# read bounce messages from variable instead of a path to mailbox
f = File.open('/path/to/mbox', 'r');    # or path to Maildir/
v = Sisimai.make(f.read)

# If you want to get bounce records which reason is "delivered", set "delivered"
# option to make() method like the following:
v = Sisimai.make('/path/to/mbox', delivered: true)

if v.is_a? Array
  v.each do |e|
    puts e.class                # Sisimai::Data
    puts e.recipient.class      # Sisimai::Address
    puts e.timestamp.class      # Sisimai::Time

    puts e.addresser.address    # [email protected] # From
    puts e.recipient.address    # [email protected]   # To
    puts e.recipient.host       # example.jp
    puts e.deliverystatus       # 5.1.1
    puts e.replycode            # 550
    puts e.reason               # userunknown
    puts e.origin               # /var/spool/bounce/Maildir/new/1740074341.eml

    h = e.damn                  # Convert to HASH
    j = e.dump('json')          # Convert to JSON string
    puts e.dump('json')         # JSON formatted bounce data
  end
end

Convert to JSON

下記のようにSisimaiのdump()メソッドをmboxかMaildirのPATHを引数にして実行すると 解析結果が文字列(JSON)で返ってきます。

# Get JSON string from parsed mailbox or Maildir/
puts Sisimai.dump('/path/to/mbox')  # or path to Maildir/

# dump() method also accepts "delivered" option like the following code:
puts Sisimai.dump('/path/to/mbox', delivered: true)

Callback feature

Sisimai 4.19.0からSisimai.make()Sisimai.dump()にLamda(Procオブジェクト) を引数hookに指定できるコールバック機能が実装されました。 hookに指定したコードによって処理された結果はSisimai::Data.catch メソッドで得ることができます。

#! /usr/bin/env ruby
require 'sisimai'
callbackto = lambda do |v|
  r = { 'x-mailer' => '', 'queue-id' => '' }

  if cv = v['message'].match(/^X-Postfix-Queue-ID:\s*(.+)$/)
    r['queue-id'] = cv[1]
  end
  r['x-mailer'] = v['headers']['x-mailer'] || ''
  return r
end

data = Sisimai.make('/path/to/mbox', hook: callbackto)
json = Sisimai.dump('/path/to/mbox', hook: callbackto)

puts data[0].catch['x-mailer']      # Apple Mail (2.1283)

コールバック機能のより詳細な使い方は Sisimai | 解析方法 - コールバック機能 をご覧ください。

One-Liner

$ ruby -rsisimai -e 'puts Sisimai.dump($*.shift)' /path/to/mbox

Output example

[{"catch":{"x-mailer":"","return-path":"[email protected]"},"token":"7e81d3b9306fc7a7f3fb4c7b705189d6806d3d6b","lhost":"omls-1.kuins.neko.example.jp","rhost":"nekonyaan0022.apcprd01.prod.exchangelabs.com","alias":"","listid":"","reason":"userunknown","action":"failed","origin":"set-of-emails/maildir/bsd/lhost-office365-13.eml","subject":"にゃーん","messageid":"","replycode":"550","smtpagent":"Office365","softbounce":0,"smtpcommand":"","destination":"neko.kyoto.example.jp","senderdomain":"example.com","feedbacktype":"","diagnosticcode":"Error Details Reported error: 550 5.1.10 RESOLVER.ADR.RecipientNotFound; Recipient not found by SMTP address lookup DSN generated by: NEKONYAAN0022.apcprd01.prod.exchangelabs.com","diagnostictype":"","deliverystatus":"5.1.10","timezoneoffset":"+0000","addresser":"[email protected]","recipient":"[email protected]","timestamp":1493508885}]

Sisimai Specification

Differences between Ruby version and Perl version

公開中のPerl版Sisimai(p5-sisimai)とRuby版Sisimai(rb-sisimai)は下記のような違いが あります。bounceHammer 2.7.13p3とSisimai(シシマイ)の違いについては Sisimai | 違いの一覧をご覧ください。

機能 Ruby version Perl version
動作環境 Ruby 2.1 - 2.6 Perl 5.10 -
JRuby 9.0.4.0-
解析精度の割合(2000通のメール)[1] 1.00 1.00
メール解析速度(1000通のメール) 2.22秒[2] 1.35秒
インストール方法 gem install cpanm, cpm
依存モジュール数(コアモジュールを除く) 1モジュール 2モジュール
LOC:ソースコードの行数 10600行 10800行
テスト件数(spec/,t/,xt/ディレクトリ) 241000件 270000件
ライセンス 二条項BSD 二条項BSD
開発会社によるサポート契約 提供中 提供中
  1. ./ANALYTICAL-PRECISIONを参照
  2. Xeon E5-2640 2.5GHz x 2 cores | 5000 bogomips | 1GB RAM | Ruby 2.3.4p301

Other spec of Sisimai

Contributing

Bug report

もしもSisimaiにバグを発見した場合はIssues にて連絡をいただけると助かります。

Emails could not be parsed

Sisimaiで解析できないバウンスメールは set-of-emails/to-be-debugged-because/sisimai-cannot-parse-yetリポジトリに追加してPull-Requestを送ってください。

Other Information

Related sites

See also

Author

@azumakuniyuki

Copyright

Copyright (C) 2015-2023 azumakuniyuki, All Rights Reserved.

License

This software is distributed under The BSD 2-Clause License.