Sisimai::Factのデータ構造

Sisimairise()メソッドは解析したデータを Sisimai::Factオブジェクトを複数個含む配列にして返します。 Sisimai 5.0.0で従来のSisimai::Dataオブジェクトは廃止になりました。 返ってきたオブジェクトは以下のようなデータ構造になっています。

詳しく
A

Action (String)

"action" はバウンスメール内のAction:フィールドの値を保持します。 この項目は、解析の過程で表記の揺れ(deliverable, failureなど)は修正され、 次の五つの値となります。


  • dalayed
  • delivered
  • expanded
  • failed
  • relayed
Action: failed
                

Addresser (Sisimai::Address)

"addresser" はバウンスメール内にある元メールの発信者アドレス(From)から作られる Sisimai::Address オブジェクトです。Sisimai::Factオブジェクトを JSON形式にダンプした場合はメールアドレス(文字列)を保持します。

  • user() - メールアドレスの"@"の左側
  • host() - メールアドレスの"@"の右側
  • address() - メールアドレス
  • verp() - VERP形式のReturn-Path
  • alias() - エイリアス
  • name() - メールヘッダの表示名(v4.22.1以降)
  • comment() - コメント(v4.22.1以降)
From: "Kijitora Cat" <kijitora@example.org>
                

alias (String)

"alias" は受信者アドレスのエイリアスです。 バウンスメール内に Original-Recipient: フィールドや "expanded from" に続くメールアドレスが記述されていたらそこから値を取り出します。

Original-Recipient: rfc822;kijitora@example.org
                
"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #kijitora"
(expanded from: <kijitora@neko.example.edu>)
                
C

catch (*) | v4.19.0以降

"catch" はSisimaiのrise()メソッドに渡したフックメソッドが 返した値を保持します。フックメソッドを渡さなかった場合は、Perlなら undef、Rubyならnilとなります。 コールバック機能とフックメソッドの設定、catch() メソッドはSisimai 4.19.0で追加されました。

Sisimai 5.0.0でコールバック機能の引数名と引数の型が変更になりました。詳細は Callback feature をご覧下さい。

D

deliverystatus (String)

"deliverystatus" はバウンスメール内の Status: フィールドの値を保持します。 もしもバウンスメールに Status: フィールドが無かった場合は "5.0.9XX" が入る事があります。 この値の形式は "4.x.x" か "5.x.x" あるいは "2.x.x" のような文字列となります。

Status: 5.0.0 (permanent failure)
                

destination (String)

"destination" は受信者アドレスのドメインパートを値として保持します。 この値は "recipient" アクセサのhost()メソッドが返す値と同じです。


diagnosticcode (String)

"diagnosticcode" はバウンスメール内の Diagnostic-Code: フィールド またはバウンスメールの本文から取り出したエラーメッセージを保持します。

この値と "diagnostictype", "action", "deliverystatus", "replycode", "smtpcommand" の各値はバウンス理由を決定する為に Sisimai::Reasonクラスから参照されます。

Diagnostic-Code: SMTP; 554 5.4.6 Too many hops
                

diagnostictype (String)

"diagnostictype" はバウンスメール内の Diagnostic-Code: フィールドの先頭部分、 "SMTP" や "X-Unix" のような値を保持します。 Diagnostic-Code: フィールドが無い場合、この値は空になります。

Diagnostic-Code: X-Unix; 255
                
F

feedbacktype (String)

"feedbacktype" はバウンスメール内のFeedback-Type:フィールドの値で、 "abuse", "fraud", "opt-out" のような値を保持します。 バウンスメールがARFフォーマットではない、または "reason" の値が "feedback" ではない場合、この値は空になります。

Content-Type: message/feedback-report

Feedback-Type: abuse
User-Agent: SMP-FBL
                
H

hardbounce (Boolean) | v5.0.0以降

Sisimai 5.0.0で新たに実装された"hardbounce"は、宛先メールアドレスが 二度と配信できない理由でバウンスしたかどうかを示す真偽値 (Perl版は01, Ruby版はtruefalse) を返します。

具体的には"reason"が次の値である場合に真となります。

同時に"softbounce"Sisimai5.0.0で廃止となりました。

L

lhost (String)

"lhost" はバウンスメール内の Reporting-MTA: フィールドの値または "Received" ヘッダから取り出した送信に使われたMTAのホスト名またはIPアドレスを保持します。

Reporting-MTA: dns; mx4.smtp.example.co.jp
                

listid (String)

"listid" はバウンスメールに含まれる元メッセージから "List-Id:"ヘッダの値を 取り出したものを保持します。元メッセージが無い形式のバウンスメールの場合、 この値は空になります。

List-Id: General discussion list for Cats <neko-list.example.org>
                
M

messageid (String)

"messageid" はバウンスメールに含まれる元メッセージの "Message-Id:" ヘッダ の値を保持します。バウンスメールに元メッセージが無い場合、この値は空になります。

Message-Id: <201310160515.r9G5FZh9018575@smtpgw.example.jp>
                
O

origin (String)

"origin" はバウンスメールに含まれる元メッセージのファイル名(パスを含む) を保持します。具体的にはSisimaiクラスのrise()メソッドやdump() に渡した第一引数です。Maildir/の場合は第一引数のディレクトリ名に ここのファイル名が結合された文字列が入ります。 標準入力から読み込んだ場合は<STDIN>が、 変数から読み込んだ場合は<MEMORY>が、それぞれ値となります。

"origin"はv4.25.6で実装されました。

R

reason (String)

"reason" はSisimaiが検出したバウンス理由 (メールが配信エラーになった理由)を保持します。 値が "undefined" か "onhold" の時はSisimaiがバウンス理由を 特定出来なかった事を意味します。

Sisimaiが検出出来るバウンス理由の一覧は バウンス理由の一覧のページで確認出来ます。

   ----- The following addresses had permanent fatal errors -----

    (reason: 550 5.1.1 Requested action not taken: mailbox unavailable)

   ----- Transcript of session follows -----
... while talking to inbound-smtp.us-west-2.amazonaws.com.:
>>> RCPT To:
<<< 550 5.1.1 Requested action not taken: mailbox unavailable
550 5.1.1 ... User unknown
>>> DATA
<<< 503 Error: need RCPT command
                

recipient (Sisimai::Address)

"recipient" はバウンスメール内にある受信者アドレスから作られるSisimai::Address オブジェクトです。このアドレスがまさに配信出来なかったアドレスとなります。 Sisimai::FactオブジェクトをJSON形式にダンプした場合はメールアドレス(文字列)を保持します。

  • user() - メールアドレスの"@"の左側
  • host() - メールアドレスの"@"の右側
  • address() - メールアドレス
  • verp() - VERP形式のReturn-Path
  • alias() - エイリアス
  • name() - メールヘッダの表示名(v4.22.1以降)
  • comment() - コメント(v4.22.1以降)
Final-Recipient: RFC822; shironeko@example.ne.jp
                
X-Failed-Recipients: kijitora@example.ed.jp
                

replycode (String)

"replycode" はバウンスメール内の "Diagnostic-Code:" フィールドや バウンスメール本文から取り出したSMTP応答コードを保持します。 値の範囲は2xx, 4xx〜5xxとなります。

----- The following addresses had permanent fatal errors -----

(reason: 550 5.1.1 ... User Unknown)
                

rhost (String)

"rhost" はバウンスメール内にある "Remote-MTA:" フィールドの値または "Received:" ヘッダから取り出した相手側MTAのホスト名かIPアドレスを保持します。

Remote-MTA: DNS; g5.example.net
                
S

senderdomain (String)

"senderdomain" は元メールの発信者アドレスのドメイン部分を保持します。 この値は "addresser" アクセサのhost()メソッドが返す値と同じです。


smtpagent (String)

"smtpagent" はバウンス理由を特定したMTAモジュール名を保持します。 例えば値が"Sendmail"であればSisimai::Lhost::Sendmailモジュールが エラーとなった受信者アドレス取得やバウンス理由特定を行った事を意味します。


smtpcommand (String)

"smtpcommand" はバウンスメールの "Diagnostic-Code:" フィールドまたは バウンスメール本文から取り出した、SMTPセッションで最後に発行したと 思われるSMTPコマンドを保持します。 バウンスメール内にSMTPコマンドの記録が無い場合、この値は空になります。

  • HELO
  • EHLO
  • MAIL
  • RCPT
  • DATA
: host mx1.example.go.jp[192.0.2.127] said: 550 5.1.6 recipient
no longer on server: kijitora@example.go.jp (in reply to RCPT TO command)                        
                

softbounce (Integer) | v5.0.0で廃止

"softbounce" の値はバウンス理由がソフトバウンス(再試行で送信可能)か ハードバウンスであるかを示します。 この項目はSisimai 4.1.28で追加されました。 とりうる値は上記の通り、1がソフトバウンス、0がハードバウンス、 -1がどちらか判断出来なかった、となります。

この項目はv5.0.0で廃止になりました。 v5.1.0までは互換性の為、 使用可能ですが、hardbounceを使ってください。

  • 1 = Soft bounce
  • 0 = Hard bounce
  • -1 = Sisimai could not decide

subject (String)

"subject" は元メールの "Subject:" ヘッダの値を保持します。 バウンスメールに元メッセージが含まれていない場合、この値は空になります。

もしも元メッセージのSubjectがMIMEエンコードされたマルチバイト文字を含むもの (日本語など非ASCII文字を使用する言語)である場合、SisimaiはUTF-8として扱います。

T

timestamp (Sisimai::Time)

"timestamp" はバウンスした日時を保持するSisima::Time (PerlではTime::Pieceの子クラス, RubyではDateTimeの子クラス) オブジェクトです。Sisimai::FactオブジェクトをJSON形式にダンプした場合、 32ビット整数のマシンタイムに変換されます。

Arrival-Date: Thu, 29 Apr 2009 23:45:33 +0900
                

timezoneoffset (String)

"timezoneoffset" はバウンスした日時のタイムゾーンを "+0900" や "-0200" のような文字列で保持します。 Sisimaiがバウンスメール内のタイムスタンプからタイムゾーンの特定に失敗した場合、 この値は "+0000" となります。

Arrival-Date: Mon, 16 Dec 2019 22:00:18 +0100 (CET)
Date: Thu, 29 Apr 2018 23:34:45 +0900 (JST)
                

token (String)

"token" は元メールの発信者アドレス、受信者アドレス、時刻を元に生成される バウンス記録の一意な識別子です。 値はMD5のハッシュ値でSisimai::Stringクラスのtoken() メソッドで生成されます。 もしもtokenの値をコマンドラインで得るなら、上記のようなコマンドを実行してください。

% printf "\x02%s\x1e%s\x1e%d\x03" sender@example.jp recipient@example.org `date '+%s'` | md5
714d72dfd972242ad04f8053267e7365