Class: InternetMessage
- Inherits:
-
Object
- Object
- InternetMessage
- Defined in:
- lib/internet_message.rb,
lib/internet_message/group.rb,
lib/internet_message/address.rb,
lib/internet_message/mailbox.rb,
lib/internet_message/received.rb,
lib/internet_message/tokenizer.rb,
lib/internet_message/message_id.rb,
lib/internet_message/content_type.rb,
lib/internet_message/header_field.rb,
lib/internet_message/content_attribute.rb,
lib/internet_message/content_disposition.rb
Defined Under Namespace
Modules: ContentAttribute Classes: Address, ContentDisposition, ContentType, Group, HeaderField, Mailbox, MessageId, Received, Token, Tokenizer, TraceBlock, TraceBlockList
Class Method Summary collapse
Instance Method Summary collapse
-
#bcc ⇒ Array of Mailbox/Group
Bcc field.
-
#body ⇒ String
Body text.
-
#cc ⇒ Array of Mailbox/Group
Cc field.
-
#charset ⇒ String
Charset attribute.
-
#close ⇒ Object
To close object.
-
#comments ⇒ Array of String
Comments field.
-
#content_description ⇒ String
Content-Description field.
-
#content_disposition ⇒ ContentDisposition
Content-Dispositoin field.
-
#content_id ⇒ MessageId
Content-Id field.
-
#content_transfer_encoding ⇒ String
Content-Transfer-Encoding field.
-
#content_type ⇒ ContentType
Content-Type field.
-
#date ⇒ DateTime
Date field.
-
#epilogue ⇒ String
Epilogue of multiple part message.
-
#field ⇒ Hash
‘field-name’ => [HeaderField, …].
-
#fields ⇒ Array of HeaderField
Header fields.
-
#from ⇒ Mailbox
From field.
-
#in_reply_to ⇒ Array of MessageId
In-Reply-To field.
-
#initialize(src, opt = {}) ⇒ InternetMessage
constructor
A new instance of InternetMessage.
-
#keywords ⇒ Array of String
Keywords field.
-
#message ⇒ InternetMessage
Message if Content-Type is ‘message/*’.
-
#message_id ⇒ MessageId
Message-Id field.
-
#mime_version ⇒ String
Mime-Version field.
-
#parts ⇒ Array of InternetMessage
Parts of multiple part message.
-
#preamble ⇒ String
Preamble of multiple part message.
-
#received ⇒ Received
Received field of first trace block.
-
#references ⇒ Array of MessageId
References field.
-
#reply_to ⇒ Array of Mailbox/Group
Reply-To field.
-
#resent_bcc ⇒ Array of Mailbox/Group
Resent-Bcc field of first trace block.
-
#resent_cc ⇒ Array of Mailbox/Group
Resent-Cc field of first trace block.
-
#resent_date ⇒ DateTime
Resent-Date field of first trace block.
-
#resent_from ⇒ Mailbox
Resent-From field of first trace block.
-
#resent_message_id ⇒ MessageId
Resent-Message-Id field of first trace block.
-
#resent_sender ⇒ Mailbox
Resent-Sender field of first trace block.
-
#resent_to ⇒ Array of Mailbox/Group
Resent-To field of first trace block.
-
#return_path ⇒ Address
Return-Path field of first trace block.
-
#sender ⇒ Mailbox
Sender field.
-
#subject ⇒ String
Subject field.
-
#subtype ⇒ String
Media subtype.
-
#to ⇒ Array of Mailbox/Group
To field.
-
#trace_blocks ⇒ TraceBlockList
Trace block list.
-
#type ⇒ String
Media type.
Constructor Details
#initialize(src, opt = {}) ⇒ InternetMessage
Returns a new instance of InternetMessage.
18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/internet_message.rb', line 18 def initialize(src, opt={}) @src = MmapScanner.new(src) @opt = opt @parsed = @parse_multipart = false @preamble = @epilogue = nil @parts = [] @rawheader = @rawbody = nil @decode_mime_header = opt[:decode_mime_header] @fields = [] @field = Hash.new{|h,k| h[k] = []} end |
Class Method Details
.decode_mime_header_str(str) ⇒ Object
269 270 271 |
# File 'lib/internet_message.rb', line 269 def self.decode_mime_header_str(str) decode_mime_header_words(str.split(/([ \t\r\n]+)/, -1)) end |
.decode_mime_header_words(words) ⇒ Object
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
# File 'lib/internet_message.rb', line 274 def self.decode_mime_header_words(words) ret = '' after_mime = nil prev_sp = ' ' words.each do |word| s = word.to_s if s =~ /\A[ \t\r\n]+\z/ prev_sp = s next end if (word.is_a?(Token) ? word.type == :TOKEN : true) && s =~ /\A=\?([^?]+)\?([bq])\?([^?]+)\?=\z/i charset, enc, data = $1, $2, $3 if enc.downcase == 'b' data = Base64.decode64(data) else data = data.gsub(/_/,' ').unpack('M').join end data = data.force_encoding(charset) rescue data ret.concat prev_sp if after_mime == false ret.concat data.encode(Encoding::UTF_8, :invalid=>:replace, :undef=>:replace) after_mime = true else ret.concat prev_sp unless after_mime.nil? ret.concat s after_mime = false end end ret end |
Instance Method Details
#bcc ⇒ Array of Mailbox/Group
Returns Bcc field.
149 |
# File 'lib/internet_message.rb', line 149 defm.call :bcc |
#body ⇒ String
Returns body text.
233 234 235 236 237 238 239 240 241 242 243 |
# File 'lib/internet_message.rb', line 233 def body parse_header s = @rawbody.to_s case content_transfer_encoding.to_s.downcase when 'base64' s = Base64.decode64 s when 'quoted-printable' s = s.unpack('M').join end s.force_encoding(charset) rescue s end |
#cc ⇒ Array of Mailbox/Group
Returns Cc field.
145 |
# File 'lib/internet_message.rb', line 145 defm.call :cc |
#charset ⇒ String
Returns charset attribute. ‘us-ascii’ if Content-Type field doesn’t exists.
228 229 230 |
# File 'lib/internet_message.rb', line 228 def charset (content_type && content_type.attribute['charset']) || 'us-ascii' end |
#close ⇒ Object
To close object. After close, don’t use this object.
31 32 33 34 35 |
# File 'lib/internet_message.rb', line 31 def close if @src.data.respond_to? :unmap @src.data.unmap end end |
#comments ⇒ Array of String
Returns Comments field.
152 153 154 |
# File 'lib/internet_message.rb', line 152 def comments field['comments'].map{|f| f.parse(@decode_mime_header)} end |
#content_description ⇒ String
Returns Content-Description field.
109 |
# File 'lib/internet_message.rb', line 109 defm.call :content_description |
#content_disposition ⇒ ContentDisposition
Returns Content-Dispositoin field.
83 |
# File 'lib/internet_message.rb', line 83 defm.call :content_disposition |
#content_id ⇒ MessageId
Returns Content-Id field.
75 |
# File 'lib/internet_message.rb', line 75 defm.call :content_id |
#content_transfer_encoding ⇒ String
Returns Content-Transfer-Encoding field.
71 |
# File 'lib/internet_message.rb', line 71 defm.call :content_transfer_encoding |
#content_type ⇒ ContentType
Returns Content-Type field.
79 |
# File 'lib/internet_message.rb', line 79 defm.call :content_type |
#date ⇒ DateTime
Returns Date field.
59 |
# File 'lib/internet_message.rb', line 59 defm.call :date |
#epilogue ⇒ String
Returns epilogue of multiple part message. nil if single part message.
252 253 254 255 |
# File 'lib/internet_message.rb', line 252 def epilogue parse_multipart @epilogue end |
#field ⇒ Hash
Returns ‘field-name’ => [HeaderField, …].
44 45 46 47 |
# File 'lib/internet_message.rb', line 44 def field parse_header @field end |
#fields ⇒ Array of HeaderField
Returns Header fields.
38 39 40 41 |
# File 'lib/internet_message.rb', line 38 def fields parse_header @fields end |
#from ⇒ Mailbox
Returns From field.
86 87 88 89 |
# File 'lib/internet_message.rb', line 86 def from f = field['from'].first f && f.parse(@decode_mime_header).first end |
#in_reply_to ⇒ Array of MessageId
Returns In-Reply-To field.
121 |
# File 'lib/internet_message.rb', line 121 defm.call :in_reply_to |
#keywords ⇒ Array of String
Returns Keywords field.
157 158 159 |
# File 'lib/internet_message.rb', line 157 def keywords field['keywords'].map{|f| f.parse(@decode_mime_header)}.flatten end |
#message ⇒ InternetMessage
Returns message if Content-Type is ‘message/*’.
264 265 266 |
# File 'lib/internet_message.rb', line 264 def type == 'message' ? InternetMessage.new(@rawbody, @opt) : nil end |
#message_id ⇒ MessageId
Returns Message-Id field.
63 |
# File 'lib/internet_message.rb', line 63 defm.call :message_id |
#mime_version ⇒ String
Returns Mime-Version field.
67 |
# File 'lib/internet_message.rb', line 67 defm.call :mime_version |
#parts ⇒ Array of InternetMessage
Returns parts of multiple part message. empty if single part message.
258 259 260 261 |
# File 'lib/internet_message.rb', line 258 def parts parse_multipart @parts end |
#preamble ⇒ String
Returns preamble of multiple part message. nil if single part message.
246 247 248 249 |
# File 'lib/internet_message.rb', line 246 def preamble parse_multipart @preamble end |
#received ⇒ Received
Returns Received field of first trace block.
215 |
# File 'lib/internet_message.rb', line 215 defm.call :received |
#references ⇒ Array of MessageId
Returns References field.
125 |
# File 'lib/internet_message.rb', line 125 defm.call :references |
#reply_to ⇒ Array of Mailbox/Group
Returns Reply-To field.
137 |
# File 'lib/internet_message.rb', line 137 defm.call :reply_to |
#resent_bcc ⇒ Array of Mailbox/Group
Returns Resent-Bcc field of first trace block.
211 |
# File 'lib/internet_message.rb', line 211 defm.call :resent_bcc |
#resent_cc ⇒ Array of Mailbox/Group
Returns Resent-Cc field of first trace block.
207 |
# File 'lib/internet_message.rb', line 207 defm.call :resent_cc |
#resent_date ⇒ DateTime
Returns Resent-Date field of first trace block.
176 |
# File 'lib/internet_message.rb', line 176 defm.call :resent_date |
#resent_from ⇒ Mailbox
Returns Resent-From field of first trace block.
180 |
# File 'lib/internet_message.rb', line 180 defm.call :resent_from |
#resent_message_id ⇒ MessageId
Returns Resent-Message-Id field of first trace block.
188 |
# File 'lib/internet_message.rb', line 188 defm.call :resent_message_id |
#resent_sender ⇒ Mailbox
Returns Resent-Sender field of first trace block.
184 |
# File 'lib/internet_message.rb', line 184 defm.call :resent_sender |
#resent_to ⇒ Array of Mailbox/Group
Returns Resent-To field of first trace block.
203 |
# File 'lib/internet_message.rb', line 203 defm.call :resent_to |
#return_path ⇒ Address
Return-Path field of first trace block
192 |
# File 'lib/internet_message.rb', line 192 defm.call :return_path |
#sender ⇒ Mailbox
Returns Sender field.
101 |
# File 'lib/internet_message.rb', line 101 defm.call :sender |
#subject ⇒ String
Returns Subject field.
105 |
# File 'lib/internet_message.rb', line 105 defm.call :subject |
#subtype ⇒ String
Returns media subtype. ‘plain’ if Content-Type field doesn’t exists.
223 224 225 |
# File 'lib/internet_message.rb', line 223 def subtype content_type ? content_type.subtype : 'plain' end |
#to ⇒ Array of Mailbox/Group
Returns To field.
141 |
# File 'lib/internet_message.rb', line 141 defm.call :to |
#trace_blocks ⇒ TraceBlockList
Returns trace block list.
162 163 164 165 |
# File 'lib/internet_message.rb', line 162 def trace_blocks parse_header @trace_blocks end |
#type ⇒ String
Returns media type. ‘text’ if Content-Type field doesn’t exists.
218 219 220 |
# File 'lib/internet_message.rb', line 218 def type content_type ? content_type.type : 'text' end |