Sisimai::Dataのデータ構造

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

詳しく
A

Action (String)

"action" はバウンスメール内のAction:フィールドの値を保持します。 この値は主に "delayed" や "failed" となります。

Action: failed
                

Addresser (Sisimai::Address)

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

  • user() - メールアドレスの"@"の左側
  • host() - メールアドレスの"@"の右側
  • address() - メールアドレス
  • verp() - VERP形式のReturn-Path
  • alias() - エイリアス
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 (*) | Beginning with v4.17.0

"catch" はSisimaiのmake()メソッドに渡したフックメソッドが 返した値を保持します。フックメソッドを渡さなかった場合は、Perlなら undef、Rubyならnilとなります。

コールバック機能とフックメソッドの設定、catch() メソッドはSisimai 4.19.0で追加されました。

#! /usr/bin/env perl
my $f = './set-of-emails/maildir/bsd/sendmail-24.eml';
my $x = sub {
    my $argv = shift;
    my $data = { 'x-mailer' => '' };

    if( $argv->{'message'} =~ m/^X-Mailer:\s*(.+)$/m ) {
        $data->{'x-mailer'} = $1;
    }
    return $data;   # この$dataがcatchの中身になる
};
my $v = Sisimai->make($f, 'hook' => $x);
for my $e ( @$v ) {
    print ref $e->catch;            # HASH
    print $e->catch->{'x-mailer'};  # Apple Mail
}
                
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
                
L

lhost (String)

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

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

listid (String)

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

List-Id: Mailman mailing list management users 
                
M

messageid (String)

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

Message-Id: <201310160515.r9G5FZh9018575@smtpgw.example.jp>
                
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::Data オブジェクトをJSON形式にダンプした場合はメールアドレス(文字列)を保持します。

  • user() - メールアドレスの"@"の左側
  • host() - メールアドレスの"@"の右側
  • address() - メールアドレス
  • verp() - VERP形式のReturn-Path
  • alias() - エイリアス
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::MTA::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)

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

  • 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::Data オブジェクトをJSON形式にダンプした場合、 32ビット整数のマシンタイムに変換されます。

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

timezoneoffset (String)

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

Remote-MTA: DNS; g5.example.net
                

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