mailparser 0.4.22a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/HISTORY +141 -0
- data/README.txt +501 -0
- data/lib/mailparser.rb +558 -0
- data/lib/mailparser/conv_charset.rb +27 -0
- data/lib/mailparser/error.rb +7 -0
- data/lib/mailparser/loose.rb +292 -0
- data/lib/mailparser/obsolete.rb +403 -0
- data/lib/mailparser/rfc2045.rb +54 -0
- data/lib/mailparser/rfc2045/parser.rb +245 -0
- data/lib/mailparser/rfc2045/scanner.rb +54 -0
- data/lib/mailparser/rfc2047.rb +82 -0
- data/lib/mailparser/rfc2183.rb +33 -0
- data/lib/mailparser/rfc2183/parser.rb +186 -0
- data/lib/mailparser/rfc2183/scanner.rb +7 -0
- data/lib/mailparser/rfc2231.rb +57 -0
- data/lib/mailparser/rfc2822.rb +212 -0
- data/lib/mailparser/rfc2822/parser.rb +883 -0
- data/lib/mailparser/rfc2822/scanner.rb +119 -0
- data/test.rb +26 -0
- data/test/test_loose.rb +371 -0
- data/test/test_mailparser.rb +1130 -0
- data/test/test_obsolete.rb +615 -0
- data/test/test_rfc2045.rb +121 -0
- data/test/test_rfc2047.rb +118 -0
- data/test/test_rfc2183.rb +60 -0
- data/test/test_rfc2231.rb +167 -0
- data/test/test_rfc2822.rb +370 -0
- metadata +81 -0
data/HISTORY
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
== 0.4.22 2010-06-11 ==
|
2
|
+
* 添付ファイルの末尾の改行コードを削除してしまっていたバグを修正
|
3
|
+
|
4
|
+
== 0.4.21 2010-06-03 ==
|
5
|
+
* :use_file オプション追加
|
6
|
+
* 省メモリ化
|
7
|
+
* Content-Type が text の時にだけ charset 変換するように修正
|
8
|
+
|
9
|
+
== 0.4.20 2010-05-04 ==
|
10
|
+
* ヘッダが8bit文字を含む場合に MailParser::Header#each が落ちることがあるバグを修正
|
11
|
+
|
12
|
+
== 0.4.19 2009-05-12 ==
|
13
|
+
* Received に \v が含まれていると無限ループになっていたバグを修正
|
14
|
+
cf. http://redmine.ruby-lang.org/issues/show/1196
|
15
|
+
|
16
|
+
== 0.4.18 2009-01-27 ==
|
17
|
+
* トークンが非常に多い文字列のパースに時間がかかっていた
|
18
|
+
|
19
|
+
== 0.4.17 2008-11-26 ==
|
20
|
+
* 閏秒が 23:59:60 しか考慮されていなかったバグを修正
|
21
|
+
|
22
|
+
== 0.4.16 2008-07-28 ==
|
23
|
+
* uuencode エンコーディングに対応
|
24
|
+
|
25
|
+
== 0.4.15 2008-06-25 ==
|
26
|
+
* 「group:, hoge@example.com;」の形式で落ちていたバグを修正
|
27
|
+
|
28
|
+
== 0.4.14 2008-04-03 ==
|
29
|
+
* 値がない Received ヘッダで落ちるバグを修正
|
30
|
+
* Header#[] で nil 値は返さないように修正
|
31
|
+
* Content-Type の subtype がない場合、type が text 以外でも plain になっていた。"" を返すように修正
|
32
|
+
* 値がない Keywords ヘッダが [nil] を返していた。[] を返すように修正
|
33
|
+
|
34
|
+
== 0.4.13 2008-03-09 ==
|
35
|
+
* Quoted-Printable のデコード時に、= の後に改行が連続していると行が結合してしまっていたバグを修正
|
36
|
+
|
37
|
+
== 0.4.12 2008-01-24 ==
|
38
|
+
* Message-Id が不正な形式の場合、空白文字を含んだIDを返していた
|
39
|
+
|
40
|
+
== 0.4.11 2008-01-15 ==
|
41
|
+
* 日付の判定を厳密にした
|
42
|
+
|
43
|
+
== 0.4.10 2007-11-06 ==
|
44
|
+
* Content-Transfer-Encoding が空の場合に落ちるバグを修正
|
45
|
+
|
46
|
+
== 0.4.9 2007-10-04 ==
|
47
|
+
* :charset_converter 追加
|
48
|
+
|
49
|
+
== 0.4.8 2007-09-17 ==
|
50
|
+
* < > がない Message-Id で落ちていた
|
51
|
+
* Message#body_preconv 追加
|
52
|
+
|
53
|
+
== 0.4.7 2007-08-29 ==
|
54
|
+
* boundary 文字列の直前の行の改行コードを無視しないといけなかった (RFC2046)
|
55
|
+
* Message.new の第一引数に渡すオブジェクトに必要なメソッドを each_line から gets に変更
|
56
|
+
* Content-Type ヘッダがない場合/charset パラメータがない場合、Message#charset が nil を返すように変更
|
57
|
+
* racc コンパイル済み .rb ファイルを同梱
|
58
|
+
* MailSuite::Message が String も受け付けるようにした
|
59
|
+
|
60
|
+
== 0.4.6 2007-08-09 ==
|
61
|
+
* :keep_raw 指定時、ヘッダの継続行が二重になっていた
|
62
|
+
|
63
|
+
== 0.4.5 2007-08-07 ==
|
64
|
+
* :decode_mime_filename 指定時、Content-Type も Content-Disposition もない場合に、落ちていたバグを修正
|
65
|
+
* 空の Content-Type, Content-Disposition でエラーになっていた
|
66
|
+
* ヘッダ行のみで区切りの空行がないパートを正しく扱えてなかった
|
67
|
+
* Message#raw の効率化
|
68
|
+
* Obsolete: RFC2231形式の添付ファイル名が正しく取得できないことがあった
|
69
|
+
|
70
|
+
== 0.4.4 2007-08-06 ==
|
71
|
+
* :keep_raw オプション追加。
|
72
|
+
* Message#raw メソッド追加。
|
73
|
+
|
74
|
+
== 0.4.3 2007-06-01 ==
|
75
|
+
* ヘッダと本文の間の区切りの空行が無い場合にエラーになっていたバグを修正
|
76
|
+
* RFC2231 パラメータが不正な時、strict=false でも ParseError になっていた
|
77
|
+
* In-Reply-To, References ヘッダを正しくパースできなかったバグを修正
|
78
|
+
|
79
|
+
== 0.4.2 2007-03-20 ==
|
80
|
+
* 添付ファイルがネストされていた場合、その次の添付ファイルを取り出せなかったバグを修正。
|
81
|
+
|
82
|
+
== 0.4.1a 2007-03-06 ==
|
83
|
+
* 64bit環境や非JST環境でもテストが通るようにテストコードを変更。
|
84
|
+
|
85
|
+
== 0.4.1 2007-03-03 ==
|
86
|
+
* ドキュメントの誤記修正。
|
87
|
+
* パース結果オブジェクトに raw メソッド追加。
|
88
|
+
* :extract_message_type を :text_body_only, :skip_body よりも優先するように変更。
|
89
|
+
* :output_charset 指定時にRFC2232形式のファイル名の charset が変換されていなかった
|
90
|
+
* Content-Type, Content-Disposition のパラメータが未知の charset でエンコーディングされていた場合に落ちていたバグを修正。
|
91
|
+
|
92
|
+
== 0.4 2007-01-16 ==
|
93
|
+
* イチから作りなおした。0.3 とは互換なし。
|
94
|
+
|
95
|
+
== 0.3.9 2006-07-10 ==
|
96
|
+
* text_body_only が true で Content-Type ヘッダがない場合に、メールの本文をないものとして扱っていたバグを修正。
|
97
|
+
|
98
|
+
== 0.3.8 2006-03-30 ==
|
99
|
+
* RFC 2231 に対応。
|
100
|
+
|
101
|
+
== 0.3.7 2006-03-11 ==
|
102
|
+
* From, To, Cc の行末が「\」の時に無限ループしていたバグを修正。
|
103
|
+
|
104
|
+
== 0.3.6 2005-10-14 ==
|
105
|
+
* phrase内に「<」「>」「(」「)」があった時にメールアドレスの取得に失敗するバグを修正。
|
106
|
+
* 「(」「)」「\(」「\)」が多く存在する行のパースに長時間かかるバグを修正。
|
107
|
+
* quoted-string内の「(~)」を除去してしまうバグを修正。
|
108
|
+
|
109
|
+
== 0.3.5 2005-06-08 ==
|
110
|
+
* 本文がHTMLで添付ファイルがついている場合に、添付ファイルが認識されないバグを修正。
|
111
|
+
|
112
|
+
== 0.3.4 2005-05-02 ==
|
113
|
+
* Date へッダの日付が UNIX 時刻の範囲外の時に落ちるバグを修正。
|
114
|
+
|
115
|
+
== 0.3.3 2005-03-31 ==
|
116
|
+
* output_charset に nil を指定した時にコード変換しないようにした。
|
117
|
+
|
118
|
+
== 0.3.2 2005-03-01 ==
|
119
|
+
* From,To,Ccへッダに奇数個の「"」があると無限ループになるバグを修正。
|
120
|
+
|
121
|
+
== 0.3.1 2005-02-21 ==
|
122
|
+
* extract_message_type=() を追加。
|
123
|
+
|
124
|
+
== 0.3 2005-01-28 ==
|
125
|
+
* 最初の text/* を :body にするのをやめた。
|
126
|
+
* :header を Hash に変更。
|
127
|
+
* :rawheader 追加。
|
128
|
+
* Uconv ではなく NKF を使用するようにした。
|
129
|
+
|
130
|
+
== 0.2.1 2005-01-28 ==
|
131
|
+
* 添付ファイルの Content-Type: が multipart/* の時に処理していなかったバグを修正。
|
132
|
+
* Content-Type が message/* の時、:body が nil ではなく "" になっていたバグを修正。
|
133
|
+
* 最初の行が空白で始まっていると落ちるバグを修正。
|
134
|
+
|
135
|
+
== 0.2 2005-01-06 ==
|
136
|
+
* UTF-8対応
|
137
|
+
* output_charset=(), text_body_only=() を追加
|
138
|
+
* Test::Unit を使用
|
139
|
+
|
140
|
+
== 0.1 2004/11/02 ==
|
141
|
+
* 公開
|
data/README.txt
ADDED
@@ -0,0 +1,501 @@
|
|
1
|
+
= MailParser =
|
2
|
+
|
3
|
+
メールメッセージを解析する。
|
4
|
+
|
5
|
+
== 作者 ==
|
6
|
+
|
7
|
+
とみたまさひろ <tommy@tmtm.org>
|
8
|
+
|
9
|
+
== ライセンス ==
|
10
|
+
|
11
|
+
Ruby ライセンス http://www.ruby-lang.org/ja/LICENSE.txt と同等。
|
12
|
+
|
13
|
+
== 機能 ==
|
14
|
+
|
15
|
+
* メールファイルをパースした結果を返す。
|
16
|
+
* メール構造による例外は発生しない(例外を発生させることも可能)。
|
17
|
+
不正な構造のメッセージがあった場合は適当に処理する。
|
18
|
+
|
19
|
+
* 0.4 でイチから作りなおしたので、0.3 とは互換がない。
|
20
|
+
require "mailparser/obsolete" すれば 0.3 と同じ機能が使用可能。
|
21
|
+
|
22
|
+
== ダウンロード ==
|
23
|
+
|
24
|
+
* http://github.com/tmtm/mailparser
|
25
|
+
|
26
|
+
== インストール ==
|
27
|
+
|
28
|
+
インストールには racc が必要。
|
29
|
+
|
30
|
+
{{{
|
31
|
+
$ make
|
32
|
+
$ make test
|
33
|
+
# make install
|
34
|
+
}}}
|
35
|
+
|
36
|
+
== 使用例 ==
|
37
|
+
|
38
|
+
{{{
|
39
|
+
require "mailparser"
|
40
|
+
File.open("/tmp/hoge.eml") do |f|
|
41
|
+
m = MailParser::Message.new(f, :decode_mime_header=>true)
|
42
|
+
m.from # => From ヘッダ (MailParser::RFC2822::Mailbox)
|
43
|
+
m.to # => To ヘッダ (MailParser::RFC2822::Mailbox の配列)
|
44
|
+
m.subject # => Subject 文字列 (String)
|
45
|
+
m.body # => 本文文字列 (String)
|
46
|
+
m.charset # => 本文文字コード (String)
|
47
|
+
m.part # => 添付ファイル (MailParser::Message の配列)
|
48
|
+
m.part[0].filename # => 1つめの添付ファイルのファイル名 (String)
|
49
|
+
m.part[0].body # => 1つめの添付ファイルの本文 (String)
|
50
|
+
end
|
51
|
+
}}}
|
52
|
+
|
53
|
+
== MailParser::Message ==
|
54
|
+
|
55
|
+
=== self.new(io, [opt]) ===
|
56
|
+
|
57
|
+
io から MailParser::Message オブジェクトを生成する。
|
58
|
+
|
59
|
+
io には IO または StringIO オブジェクトを指定する。実際には1行毎の文
|
60
|
+
字列を返す gets イテレータを持ち、処理した位置を覚えていて次回実
|
61
|
+
行時に続きから実行できるオブジェクトであれば何でも良い。
|
62
|
+
String オブジェクトも指定可能。内部で StringIO が生成されて使用される。
|
63
|
+
|
64
|
+
opt は Hash オブジェクトで次の値を指定できる。
|
65
|
+
|
66
|
+
:skip_body => true
|
67
|
+
本文をスキップする。デフォルトは false。
|
68
|
+
|
69
|
+
:text_body_only => true
|
70
|
+
text/* type 以外の本文をスキップする。デフォルトは false。
|
71
|
+
|
72
|
+
:extract_message_type => true
|
73
|
+
message/* type を展開する。デフォルトは false。
|
74
|
+
|
75
|
+
:decode_mime_header => true
|
76
|
+
MIMEヘッダをデコードする。デフォルトは false。
|
77
|
+
|
78
|
+
:decode_mime_filename => true
|
79
|
+
MIME エンコードされたファイル名をデコードする。デフォルトは false。
|
80
|
+
|
81
|
+
:output_charset => charsetname
|
82
|
+
出力文字コード。デフォルトは nil で無変換。
|
83
|
+
|
84
|
+
:charset_converter => proc{|f,t,s| ...}
|
85
|
+
文字コード変換時に呼び出される Proc オブジェクト。引数は、元charset,新charset,元文字列。デフォルトは MailParser::ConvCharset.conv_charset が呼ばれる。
|
86
|
+
|
87
|
+
:strict => true
|
88
|
+
RFC違反時に ParseError 例外を発生する。デフォルトは false。
|
89
|
+
|
90
|
+
:keep_raw => true
|
91
|
+
生メッセージ文字列を保持する。デフォルトは false。
|
92
|
+
|
93
|
+
:use_file => bytes
|
94
|
+
raw が指定したサイズを超えたら、メモリではなくファイルを使う。nil 指定時は無制限にメモリを使う。デフォルトは nil。
|
95
|
+
|
96
|
+
=== from ===
|
97
|
+
|
98
|
+
From ヘッダのパース結果の最初のアドレスを MailParser::Mailbox オブジェクトで返す。
|
99
|
+
{{{
|
100
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
101
|
+
From: TOMITA Masahiro <tommy@tmtm.org>
|
102
|
+
EOS
|
103
|
+
m.from.display_name # => "TOMITA Masahiro"
|
104
|
+
m.from.addr_spec.to_s # => "tommy@tmtm.org"
|
105
|
+
}}}
|
106
|
+
|
107
|
+
=== to ===
|
108
|
+
|
109
|
+
To ヘッダのパース結果を MailParser::Mailbox オブジェクトの配列で返す。
|
110
|
+
{{{
|
111
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
112
|
+
To: TOMITA Masahiro <tommy@tmtm.org>, foo@example.com
|
113
|
+
EOS
|
114
|
+
m.to[0].to_s # => "TOMITA Masahiro <tommy@tmt.morg>"
|
115
|
+
m.to[1].to_s # => "<foo@example.com>"
|
116
|
+
}}}
|
117
|
+
|
118
|
+
=== cc ===
|
119
|
+
|
120
|
+
Cc ヘッダのパース結果を MailParser::Mailbox オブジェクトの配列で返す。
|
121
|
+
|
122
|
+
=== subject ===
|
123
|
+
|
124
|
+
Subject ヘッダの値を文字列で返す。
|
125
|
+
{{{
|
126
|
+
m = MailParser::Message.new(StringIO.new(<<EOS), :decode_mime_header=>true, :output_charset=>"utf-8")
|
127
|
+
Subject: =?iso-2022-jp?b?GyRCJEgkXyQ/JEckORsoQg==?=
|
128
|
+
EOS
|
129
|
+
m.subject # => "とみたです"
|
130
|
+
}}}
|
131
|
+
|
132
|
+
=== type ===
|
133
|
+
|
134
|
+
Content-Type ヘッダのタイプを小文字の文字列で返す。
|
135
|
+
Content-Type がない場合は "text" を返す。
|
136
|
+
{{{
|
137
|
+
m = MailParser::Message.new(StringIO.new(<<EOS), :decode_mime_header=>true, :output_charset=>"utf-8")
|
138
|
+
Content-Type: Text/Plain; charset=ISO-2022-JP
|
139
|
+
EOS
|
140
|
+
m.type # => "text"
|
141
|
+
m.subtype # => "plain"
|
142
|
+
m.charset # => "iso-2022-jp"
|
143
|
+
}}}
|
144
|
+
|
145
|
+
=== subtype ===
|
146
|
+
|
147
|
+
Content-Type ヘッダのサブタイプを小文字の文字列で返す。
|
148
|
+
Content-Type がない場合またはサブタイプがない場合は "plain" を返す。
|
149
|
+
|
150
|
+
=== charset ===
|
151
|
+
|
152
|
+
Content-Type ヘッダの charset 属性を小文字の文字列で返す。
|
153
|
+
Content-Type がない場合または charset がない場合は nil を返す。
|
154
|
+
|
155
|
+
=== multipart? ===
|
156
|
+
|
157
|
+
マルチパートメッセージの場合 true を返す。
|
158
|
+
|
159
|
+
=== filename ===
|
160
|
+
|
161
|
+
ファイル名を返す。
|
162
|
+
ファイル名は、Content-Disposition ヘッダの filename 属性または Content-Type ヘッダの name 属性から取得する(Content-Disposition ヘッダが優先)。
|
163
|
+
{{{
|
164
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
165
|
+
Content-Disposition: attachment; filename="hogehoge.txt"
|
166
|
+
EOS
|
167
|
+
m.filename # => "hogehoge.txt"
|
168
|
+
}}}
|
169
|
+
|
170
|
+
{{{
|
171
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
172
|
+
Content-Disposition: attachment; filename*=utf-8''%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D.txt
|
173
|
+
EOS
|
174
|
+
m.filename # => "ファイル名.txt"
|
175
|
+
}}}
|
176
|
+
|
177
|
+
RFC的には正しくない(でも一般に使われている)ダブルクォートで括られてMIMEエンコードされた文字列を MIMEデコードしたい場合は、:decode_mime_filename=>true を指定する必要がある。
|
178
|
+
|
179
|
+
{{{
|
180
|
+
m = MailParser::Message.new(StringIO.new(<<EOS), :decode_mime_filename=>true)
|
181
|
+
Content-Disposition: attachment; filename="=?utf-8?b?44OV44Kh44Kk44Or5ZCNLnR4dA==?="
|
182
|
+
EOS
|
183
|
+
m.filename # => "ファイル名"
|
184
|
+
}}}
|
185
|
+
|
186
|
+
=== header ===
|
187
|
+
|
188
|
+
ヘッダを表す MailParser::Header オブジェクトを返す。
|
189
|
+
MailParser::Header はハッシュのように使用できる。
|
190
|
+
キーは小文字のヘッダ名文字列で、値はヘッダオブジェクトの配列(複数存在する場合があるので配列)。
|
191
|
+
{{{
|
192
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
193
|
+
From: TOMITA Masahiro <tommy@tmtm.org>
|
194
|
+
To: foo@example.com
|
195
|
+
Subject: test subject
|
196
|
+
EOS
|
197
|
+
m.header["from"][0] # => MailParser::Mailbox の配列
|
198
|
+
m.header["to"][0] # => MailParser::Mailbox の配列
|
199
|
+
m.header["subject"][0] # => String
|
200
|
+
}}}
|
201
|
+
|
202
|
+
ヘッダとパース結果のクラスの対応は次の通り。
|
203
|
+
|
204
|
+
|| Date || MailParser::DateTime
|
205
|
+
|| From || MailParser::Mailbox の配列
|
206
|
+
|| Sender || MailParser::Mailbox
|
207
|
+
|| Reply-To || MailParser::Mailbox または MailParser::Group の配列
|
208
|
+
|| To || MailParser::Mailbox または MailParser::Group の配列
|
209
|
+
|| Cc || MailParser::Mailbox または MailParser::Group の配列
|
210
|
+
|| Bcc || MailParser::Mailbox または MailParser::Group の配列
|
211
|
+
|| Message-Id || MailParser::MsgId
|
212
|
+
|| In-Reply-To || 文字列または MailParser::MsgId の配列
|
213
|
+
|| References || 文字列または MailParser::MsgId の配列
|
214
|
+
|| Keywords || 文字列の配列
|
215
|
+
|| Resent-Date || MailParser::DateTime
|
216
|
+
|| Resent-From || MailParser::Mailbox の配列
|
217
|
+
|| Resent-To || MailParser::Mailbox または MailParser::Group の配列
|
218
|
+
|| Resent-Cc || MailParser::Mailbox または MailParser::Group の配列
|
219
|
+
|| Resent-Bcc || MailParser::Mailbox または MailParser::Group の配列
|
220
|
+
|| Resent-Message-Id || MailParser::MsgId
|
221
|
+
|| Return-Path || MailParser::Mailbox または nil (<> の場合)
|
222
|
+
|| Received || MailParser::Received
|
223
|
+
|| Content-Type || MailParser::ContentType
|
224
|
+
|| Content-Transfer-Encoding || MailParser::ContentTransferEncoding
|
225
|
+
|| Content-Id || MailParser::MsgId
|
226
|
+
|| Mime-Version || 文字列
|
227
|
+
|| Content-Disposition || MailParser::ContentDisposition
|
228
|
+
|
229
|
+
=== body ===
|
230
|
+
|
231
|
+
本文文字列を返す。
|
232
|
+
{{{
|
233
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
234
|
+
From: TOMITA Masahiro <tommy@tmtm.org>
|
235
|
+
Content-Type: text/plain; charset=utf-8
|
236
|
+
|
237
|
+
これは本文です。
|
238
|
+
EOS
|
239
|
+
m.body # => "これは本文です。\n"
|
240
|
+
}}}
|
241
|
+
|
242
|
+
=== body_preconv ===
|
243
|
+
|
244
|
+
本文の charset変換前文字列を返す。
|
245
|
+
{{{
|
246
|
+
m = MailParser::Message.new(<<EOS)
|
247
|
+
From: TOMITA Masahiro <tommy@tmtm.org>
|
248
|
+
Content-Type: text/plain; charset=iso-2022-jp
|
249
|
+
|
250
|
+
\e$B$3$l$OK\\J8$G$9\e(B
|
251
|
+
EOS
|
252
|
+
m.body # => "これは本文です\n"
|
253
|
+
m.body_preconv # => "\e$B$3$l$OK\\J8$G$9\e(B\n"
|
254
|
+
}}}
|
255
|
+
|
256
|
+
=== part ===
|
257
|
+
|
258
|
+
マルチパートメッセージの場合、各パートを表す MailParser::Message オブジェクトの配列を返す。
|
259
|
+
マルチパートメッセージでない場合は空配列を返す。
|
260
|
+
{{{
|
261
|
+
m = MailParser::Message.new(StringIO.new(<<EOS, :output_charset=>"utf8"))
|
262
|
+
Content-Type: multipart/mixed; boundary="abcdefg"
|
263
|
+
|
264
|
+
--abcdefg
|
265
|
+
Content-Type: text/plain
|
266
|
+
|
267
|
+
first part.
|
268
|
+
--abcdefg
|
269
|
+
Content-Type: text/plain
|
270
|
+
|
271
|
+
second part.
|
272
|
+
--abcdefg--
|
273
|
+
EOS
|
274
|
+
m.part.size # => 2
|
275
|
+
m.part[0] # => 最初のパートの MailParser::Message オブジェクト
|
276
|
+
m.part[1] # => 2番目のパートの MailParser::Message オブジェクト
|
277
|
+
}}}
|
278
|
+
|
279
|
+
=== message ===
|
280
|
+
|
281
|
+
:extract_message_type=>true で message タイプのメッセージの場合、本文が示すメッセージの Mailparser::Message オブジェクトを返す。
|
282
|
+
:extract_message_type=>false または message タイプでない場合は nil を返す。
|
283
|
+
{{{
|
284
|
+
m = MailParser::Message.new(StringIO.new(<<EOS), :extract_message_type=>true)
|
285
|
+
Content-Type: message/rfc822
|
286
|
+
|
287
|
+
Subject: message subject
|
288
|
+
|
289
|
+
message body
|
290
|
+
EOS
|
291
|
+
m.message.subject # => "message subject"
|
292
|
+
}}}
|
293
|
+
|
294
|
+
=== rawheader ===
|
295
|
+
|
296
|
+
ヘッダ部文字列をパースせずにそのまま返す。
|
297
|
+
{{{
|
298
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
299
|
+
From: TOMITA Masahiro <tommy@tmtm.org>
|
300
|
+
To: foo@example.com
|
301
|
+
Subject: subject
|
302
|
+
|
303
|
+
body message
|
304
|
+
EOS
|
305
|
+
m.rawheader # => "From: TOMITA Masahiro <tommy@tmtm.org>\nTo: foo@example.com\nSubject: subject\n"
|
306
|
+
}}}
|
307
|
+
|
308
|
+
=== raw ===
|
309
|
+
|
310
|
+
生メッセージ文字列を返す。:keep_raw=>true である必要がある。
|
311
|
+
:keep_raw=>false の場合は空文字列が返る。
|
312
|
+
{{{
|
313
|
+
m = MailParser::Message.new(StringIO.new(<<EOS), :keep_raw=>true)
|
314
|
+
From: TOMITA Masahiro <tommy@tmtm.org>
|
315
|
+
To: foo@example.com
|
316
|
+
Subject: subject
|
317
|
+
|
318
|
+
body message
|
319
|
+
EOS
|
320
|
+
m.rawheader # => "From: TOMITA Masahiro <tommy@tmtm.org>\nTo: foo@example.com\nSubject: subject\n"
|
321
|
+
}}}
|
322
|
+
|
323
|
+
== MailParser::Header ==
|
324
|
+
|
325
|
+
同じ名前を持つヘッダを表すクラス。
|
326
|
+
|
327
|
+
=== add(name, body) ===
|
328
|
+
name ヘッダの値として body を追加する。
|
329
|
+
|
330
|
+
=== [](name) ===
|
331
|
+
name ヘッダの値をパースした結果オブジェクトの配列を返す。
|
332
|
+
パース結果オブジェクトは raw メソッドを持ち、パース前文字列を取り出すことができる。
|
333
|
+
|
334
|
+
=== raw(name) ===
|
335
|
+
name ヘッダの値のパース前の文字列の配列を返す。
|
336
|
+
|
337
|
+
=== keys ===
|
338
|
+
ヘッダ名文字列の一覧を返す。
|
339
|
+
|
340
|
+
=== key?(name) ===
|
341
|
+
name ヘッダがあれば真。
|
342
|
+
|
343
|
+
=== each {|n,v| } ===
|
344
|
+
各ヘッダについてブロックを繰り返す。
|
345
|
+
ブロック引数は、1番目がヘッダ名文字列、2番目がパース結果オブジェクトの配列。
|
346
|
+
|
347
|
+
== MailParser::DateTime ==
|
348
|
+
|
349
|
+
Date ヘッダを表すクラス。
|
350
|
+
|
351
|
+
=== year ===
|
352
|
+
|
353
|
+
年を表す整数。
|
354
|
+
|
355
|
+
=== month ===
|
356
|
+
|
357
|
+
月を表す整数。
|
358
|
+
|
359
|
+
=== day ===
|
360
|
+
|
361
|
+
日を表す整数。
|
362
|
+
|
363
|
+
=== hour ===
|
364
|
+
|
365
|
+
時を表す整数。
|
366
|
+
|
367
|
+
=== min ===
|
368
|
+
|
369
|
+
分を表す整数。
|
370
|
+
|
371
|
+
=== sec ===
|
372
|
+
|
373
|
+
秒を表す整数。
|
374
|
+
|
375
|
+
=== zone ===
|
376
|
+
|
377
|
+
タイムゾーンを表す文字列。「+9999」または「-9999」の形式。
|
378
|
+
|
379
|
+
=== time ===
|
380
|
+
|
381
|
+
Time オブジェクトを返す。範囲外の日付の場合は :strict が false でも ArgumentError 例外が発生するので注意。
|
382
|
+
|
383
|
+
== MailParser::Mailbox ==
|
384
|
+
|
385
|
+
メールアドレスを表すクラス。
|
386
|
+
|
387
|
+
=== addr_spec ===
|
388
|
+
|
389
|
+
メールアドレスを表す MailParser::AddrSpec を返す。
|
390
|
+
|
391
|
+
=== local_part ===
|
392
|
+
|
393
|
+
ローカルパートを表す文字列。
|
394
|
+
MailParser::Mailbox#addr_spec.local_part と同じ。
|
395
|
+
|
396
|
+
=== domain ===
|
397
|
+
|
398
|
+
ドメインを表す文字列。
|
399
|
+
addr_spec.domain と同じ。
|
400
|
+
|
401
|
+
=== display_name ===
|
402
|
+
|
403
|
+
表示名を表す文字列。
|
404
|
+
|
405
|
+
=== phrase ===
|
406
|
+
|
407
|
+
display_name と同じ。
|
408
|
+
|
409
|
+
== MailParser::Group ==
|
410
|
+
|
411
|
+
グループアドレスを表すクラス。
|
412
|
+
|
413
|
+
=== mailbox_list ===
|
414
|
+
|
415
|
+
MailParser::Mailbox の配列。
|
416
|
+
|
417
|
+
=== display_name ===
|
418
|
+
|
419
|
+
表示名を表す文字列。
|
420
|
+
|
421
|
+
=== phrase ===
|
422
|
+
|
423
|
+
display_name と同じ。
|
424
|
+
|
425
|
+
== MailParser::MsgId ==
|
426
|
+
|
427
|
+
=== msg_id ===
|
428
|
+
|
429
|
+
メッセージID文字列。先頭と末尾の < > は含まない。
|
430
|
+
|
431
|
+
== MailParser::Received ==
|
432
|
+
|
433
|
+
Received ヘッダを表すクラス。
|
434
|
+
|
435
|
+
=== name_val ===
|
436
|
+
|
437
|
+
Received ヘッダ中の名前(小文字の文字列)と値(文字列)の組を表す Hash を返す。
|
438
|
+
{{{
|
439
|
+
m = MailParser::Message.new(StringIO.new(<<EOS))
|
440
|
+
Received: from mx1.tmtm.org (localhost [127.0.0.1])
|
441
|
+
by mx2.tmtm.org (Postfix) with ESMTP id 3ED69108383
|
442
|
+
for <tommy@tmtm.org>; Tue, 16 Jan 2007 14:20:23 +0900 (JST)
|
443
|
+
EOS
|
444
|
+
r = m.header["received"][0]
|
445
|
+
r.name_val["from"] # => "mx1.tmtm.org"
|
446
|
+
r.name_val["by"] # => "mx2.tmtm.org"
|
447
|
+
r.name_val["with"] # => "ESMTP"
|
448
|
+
r.name_val["for"] # => "tommy@tmtm.org"
|
449
|
+
}}}
|
450
|
+
|
451
|
+
=== date_time ===
|
452
|
+
|
453
|
+
Received ヘッダ中の日時を表す MailParser::DateTime オブジェクトを返す。
|
454
|
+
|
455
|
+
== MailParser::ContentType ==
|
456
|
+
|
457
|
+
Content-Type ヘッダのパラメータを表すクラス。
|
458
|
+
|
459
|
+
=== type ===
|
460
|
+
|
461
|
+
Content-Type ヘッダのタイプを表す小文字の文字列を返す。
|
462
|
+
|
463
|
+
=== subtype ===
|
464
|
+
|
465
|
+
Content-Type ヘッダのサブタイプを表す小文字の文字列を返す。
|
466
|
+
|
467
|
+
=== params ===
|
468
|
+
|
469
|
+
Content-Type ヘッダのパラメータを表す Hash を返す。
|
470
|
+
Hash のキーは小文字の文字列。値は文字列。
|
471
|
+
|
472
|
+
== MailParser::ContentTransferEncoding ==
|
473
|
+
|
474
|
+
Content-Transfer-Encoding ヘッダを表すクラス。
|
475
|
+
|
476
|
+
=== mechanism ===
|
477
|
+
|
478
|
+
Content-Transfer-Encoding ヘッダの値を小文字の文字列で返す。
|
479
|
+
|
480
|
+
== MailParser::ContentDisposition ==
|
481
|
+
|
482
|
+
=== type ===
|
483
|
+
|
484
|
+
Content-Disposition ヘッダのタイプを表す小文字の文字列を返す。
|
485
|
+
|
486
|
+
=== params ===
|
487
|
+
|
488
|
+
Content-Disposition ヘッダのパラメータを表す Hash を返す。
|
489
|
+
Hash のキーは小文字の文字列。値は文字列。
|
490
|
+
|
491
|
+
== MailParser::AddrSpec ==
|
492
|
+
|
493
|
+
メールアドレスを表すクラス。
|
494
|
+
|
495
|
+
=== local_part ===
|
496
|
+
|
497
|
+
メールアドレスのローカルパート文字列を返す。
|
498
|
+
|
499
|
+
=== domain ===
|
500
|
+
|
501
|
+
メールアドレスのドメイン部文字列を返す。
|