Sisimaiのmake()メソッドは解析したデータを Sisimai::Dataオブジェクトを複数個含む配列にして返します。 返ってきたオブジェクトは以下のようなデータ構造になっています。
"action" はバウンスメール内のAction:フィールドの値を保持します。
この値は主に "delayed" や "failed" となります。
Action: failed
"addresser" はバウンスメール内にある元メールの発信者アドレス(From)から作られる
Sisimai::Address オブジェクトです。
Sisimai::Data オブジェクトをJSON形式にダンプした場合はメールアドレス(文字列)を保持します。
From: "Kijitora Cat" <kijitora@example.org>
"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>)
"catch" はSisimaiのmake()メソッドに渡したフックメソッドが
返した値を保持します。フックメソッドを渡さなかった場合は、Perlなら
undef、Rubyならnilとなります。
コールバック機能とフックメソッドの設定、catch() メソッドはSisimai 4.19.0で追加されました。
#! /usr/bin/env perl my $f = './set-of-emails/maildir/bsd/lhost-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 }
"deliverystatus" はバウンスメール内の Status: フィールドの値を保持します。
もしもバウンスメールに Status: フィールドが無かった場合は "5.0.9XX" が入る事があります。
この値の形式は "4.x.x" か "5.x.x" あるいは "2.x.x" のような文字列となります。
Status: 5.0.0 (permanent failure)
"destination" は受信者アドレスのドメインパートを値として保持します。
この値は "recipient" アクセサのhost()メソッドが返す値と同じです。
"diagnosticcode" はバウンスメール内の Diagnostic-Code: フィールド
またはバウンスメールの本文から取り出したエラーメッセージを保持します。
この値と "diagnostictype", "action", "deliverystatus", "replycode", "smtpcommand" の各値はバウンス理由を決定する為に Sisimai::Reason クラスから参照されます。
Diagnostic-Code: SMTP; 554 5.4.6 Too many hops
"diagnostictype" はバウンスメール内の Diagnostic-Code: フィールドの先頭部分、
"SMTP" や "X-Unix" のような値を保持します。
Diagnostic-Code: フィールドが無い場合、この値は空になります。
Diagnostic-Code: X-Unix; 255
"feedbacktype" はバウンスメール内のFeedback-Type:フィールドの値で、
"abuse", "fraud", "opt-out" のような値を保持します。
バウンスメールがARFフォーマットではない、または "reason" の値が "feedback"
ではない場合、この値は空になります。
Content-Type: message/feedback-report Feedback-Type: abuse User-Agent: SMP-FBL
"lhost" はバウンスメール内の Reporting-MTA: フィールドの値または
"Received" ヘッダから取り出した送信に使われたMTAのホスト名またはIPアドレスを保持します。
Reporting-MTA: dns; mx4.smtp.example.co.jp
"listid" はバウンスメールに含まれる元メッセージから "List-Id:"
ヘッダの値を撮り出したものを保持します。
元メッセージが無い形式のバウンスメールの場合、この値は空になります。
List-Id: Mailman mailing list management users
"messageid" はバウンスメールに含まれる元メッセージの "Message-Id:" ヘッダ
の値を保持します。バウンスメールに元メッセージが無い場合、この値は空になります。
Message-Id: <201310160515.r9G5FZh9018575@smtpgw.example.jp>
"origin" はバウンスメールに含まれる元メッセージのファイル名(パスを含む)
を保持します。具体的にはSisimaiクラスのmake()メソッドやdump()
に渡した第一引数です。Maildir/の場合は第一引数のディレクトリ名に
ここのファイル名が結合された文字列が入ります。
標準入力から読み込んだ場合は<STDIN>が、
変数から読み込んだ場合は<MEMORY>が、それぞれ値となります。
"origin"はv4.25.6で実装されました。
"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 オブジェクトです。
このアドレスがまさに配信出来なかったアドレスとなります。
Sisimai::Data オブジェクトをJSON形式にダンプした場合はメールアドレス(文字列)を保持します。
Final-Recipient: RFC822; shironeko@example.ne.jp
X-Failed-Recipients: kijitora@example.ed.jp
"replycode" はバウンスメール内の "Diagnostic-Code:" フィールドや
バウンスメール本文から取り出したSMTP応答コードを保持します。
値の範囲は2xx, 4xx〜5xxとなります。
----- The following addresses had permanent fatal errors -----(reason: 550 5.1.1 ... User Unknown)
"rhost" はバウンスメール内にある "Remote-MTA:" フィールドの値または
"Received:" ヘッダから取り出した相手側MTAのホスト名かIPアドレスを保持します。
Remote-MTA: DNS; g5.example.net
"senderdomain" は元メールの発信者アドレスのドメイン部分を保持します。
この値は "addresser" アクセサのhost()メソッドが返す値と同じです。
"smtpagent" はバウンス理由を特定したMTAモジュール名を保持します。
例えば値が "Email::Sendmail" であれば Sisimai::Lhost::Sendmail
モジュールがエラーとなった受信者アドレス取得や
バウンス理由特定を行った事を意味します。
"smtpcommand" はバウンスメールの "Diagnostic-Code:" フィールドまたは
バウンスメール本文から取り出した、SMTPセッションで最後に発行したと
思われるSMTPコマンドを保持します。
バウンスメール内にSMTPコマンドの記録が無い場合、この値は空になります。
: 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" の値はバウンス理由がソフトバウンス(再試行で送信可能)か
ハードバウンスであるかを示します。
この項目はSisimai 4.1.28で追加されました。
とりうる値は上記の通り、1がソフトバウンス、0がハードバウンス、
-1がどちらか判断出来なかった、となります。
"subject" は元メールの "Subject:" ヘッダの値を保持します。
バウンスメールに元メッセージが含まれていない場合、この値は空になります。
もしも元メッセージのSubjectがMIMEエンコードされたマルチバイト文字を含むもの (日本語など非ASCII文字を使用する言語)である場合、SisimaiはUTF-8として扱います。
"timestamp" はバウンスした日時を保持する Sisima::Time
(PerlではTime::Pieceの子クラス, RubyではDateTimeの子クラス)
オブジェクトです。
Sisimai::Data オブジェクトをJSON形式にダンプした場合、
32ビット整数のマシンタイムに変換されます。
Arrival-Date: Thu, 29 Apr 2009 23:45:33 +0900
"timezoneoffset" はバウンスした日時のタイムゾーンを "+0900" や "-0200"
のような文字列で保持します。
Sisimaiがバウンスメール内のタイムスタンプからタイムゾーンの特定に失敗した場合、
この値は "+0000" となります。
Remote-MTA: DNS; g5.example.net
"token" は元メールの発信者アドレス、受信者アドレス、時刻を元に生成される
バウンス記録の一意な識別子です。
値はMD5のハッシュ値で Sisimai::String クラスのtoken()
メソッドで生成されます。
もしもtokenの値をコマンドラインで得るなら、上記のようなコマンドを実行してください。
% printf "\x02%s\x1e%s\x1e%d\x03" sender@example.jp recipient@example.org `date '+%s'` | md5 714d72dfd972242ad04f8053267e7365