Class: InternetMessage

Inherits:
Object
  • Object
show all
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

Constructor Details

#initialize(src, opt = {}) ⇒ InternetMessage

Returns a new instance of InternetMessage.

Parameters:

  • src (File, MmapScanner, String)

    message source

  • opt (Hash) (defaults to: {})

    option

Options Hash (opt):

  • :decode_mime_header(nil) (boolean)

    to decode RFC2047 mime header



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

#bccArray of Mailbox/Group

Returns Bcc field.

Returns:



149
# File 'lib/internet_message.rb', line 149

defm.call :bcc

#bodyString

Returns body text.

Returns:

  • (String)

    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

#ccArray of Mailbox/Group

Returns Cc field.

Returns:



145
# File 'lib/internet_message.rb', line 145

defm.call :cc

#charsetString

Returns charset attribute. ‘us-ascii’ if Content-Type field doesn’t exists.

Returns:

  • (String)

    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

#closeObject

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

#commentsArray of String

Returns Comments field.

Returns:

  • (Array of String)

    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_descriptionString

Returns Content-Description field.

Returns:

  • (String)

    Content-Description field



109
# File 'lib/internet_message.rb', line 109

defm.call :content_description

#content_dispositionContentDisposition

Returns Content-Dispositoin field.

Returns:



83
# File 'lib/internet_message.rb', line 83

defm.call :content_disposition

#content_idMessageId

Returns Content-Id field.

Returns:



75
# File 'lib/internet_message.rb', line 75

defm.call :content_id

#content_transfer_encodingString

Returns Content-Transfer-Encoding field.

Returns:

  • (String)

    Content-Transfer-Encoding field



71
# File 'lib/internet_message.rb', line 71

defm.call :content_transfer_encoding

#content_typeContentType

Returns Content-Type field.

Returns:



79
# File 'lib/internet_message.rb', line 79

defm.call :content_type

#dateDateTime

Returns Date field.

Returns:

  • (DateTime)

    Date field



59
# File 'lib/internet_message.rb', line 59

defm.call :date

#epilogueString

Returns epilogue of multiple part message. nil if single part message.

Returns:

  • (String)

    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

#fieldHash

Returns ‘field-name’ => [HeaderField, …].

Returns:

  • (Hash)

    ‘field-name’ => [HeaderField, …]



44
45
46
47
# File 'lib/internet_message.rb', line 44

def field
  parse_header
  @field
end

#fieldsArray of HeaderField

Returns Header fields.

Returns:



38
39
40
41
# File 'lib/internet_message.rb', line 38

def fields
  parse_header
  @fields
end

#fromMailbox

Returns From field.

Returns:



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_toArray of MessageId

Returns In-Reply-To field.

Returns:



121
# File 'lib/internet_message.rb', line 121

defm.call :in_reply_to

#keywordsArray of String

Returns Keywords field.

Returns:

  • (Array of String)

    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

#messageInternetMessage

Returns message if Content-Type is ‘message/*’.

Returns:



264
265
266
# File 'lib/internet_message.rb', line 264

def message
  type == 'message' ? InternetMessage.new(@rawbody, @opt) : nil
end

#message_idMessageId

Returns Message-Id field.

Returns:



63
# File 'lib/internet_message.rb', line 63

defm.call :message_id

#mime_versionString

Returns Mime-Version field.

Returns:

  • (String)

    Mime-Version field



67
# File 'lib/internet_message.rb', line 67

defm.call :mime_version

#partsArray of InternetMessage

Returns parts of multiple part message. empty if single part message.

Returns:

  • (Array of InternetMessage)

    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

#preambleString

Returns preamble of multiple part message. nil if single part message.

Returns:

  • (String)

    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

#receivedReceived

Returns Received field of first trace block.

Returns:

  • (Received)

    Received field of first trace block



215
# File 'lib/internet_message.rb', line 215

defm.call :received

#referencesArray of MessageId

Returns References field.

Returns:



125
# File 'lib/internet_message.rb', line 125

defm.call :references

#reply_toArray of Mailbox/Group

Returns Reply-To field.

Returns:



137
# File 'lib/internet_message.rb', line 137

defm.call :reply_to

#resent_bccArray of Mailbox/Group

Returns Resent-Bcc field of first trace block.

Returns:

  • (Array of Mailbox/Group)

    Resent-Bcc field of first trace block



211
# File 'lib/internet_message.rb', line 211

defm.call :resent_bcc

#resent_ccArray of Mailbox/Group

Returns Resent-Cc field of first trace block.

Returns:

  • (Array of Mailbox/Group)

    Resent-Cc field of first trace block



207
# File 'lib/internet_message.rb', line 207

defm.call :resent_cc

#resent_dateDateTime

Returns Resent-Date field of first trace block.

Returns:

  • (DateTime)

    Resent-Date field of first trace block



176
# File 'lib/internet_message.rb', line 176

defm.call :resent_date

#resent_fromMailbox

Returns Resent-From field of first trace block.

Returns:

  • (Mailbox)

    Resent-From field of first trace block



180
# File 'lib/internet_message.rb', line 180

defm.call :resent_from

#resent_message_idMessageId

Returns Resent-Message-Id field of first trace block.

Returns:

  • (MessageId)

    Resent-Message-Id field of first trace block



188
# File 'lib/internet_message.rb', line 188

defm.call :resent_message_id

#resent_senderMailbox

Returns Resent-Sender field of first trace block.

Returns:

  • (Mailbox)

    Resent-Sender field of first trace block



184
# File 'lib/internet_message.rb', line 184

defm.call :resent_sender

#resent_toArray of Mailbox/Group

Returns Resent-To field of first trace block.

Returns:

  • (Array of Mailbox/Group)

    Resent-To field of first trace block



203
# File 'lib/internet_message.rb', line 203

defm.call :resent_to

#return_pathAddress

Return-Path field of first trace block

Returns:

  • (Address)

    Return-Path field of first trace block



192
# File 'lib/internet_message.rb', line 192

defm.call :return_path

#senderMailbox

Returns Sender field.

Returns:



101
# File 'lib/internet_message.rb', line 101

defm.call :sender

#subjectString

Returns Subject field.

Returns:

  • (String)

    Subject field



105
# File 'lib/internet_message.rb', line 105

defm.call :subject

#subtypeString

Returns media subtype. ‘plain’ if Content-Type field doesn’t exists.

Returns:

  • (String)

    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

#toArray of Mailbox/Group

Returns To field.

Returns:



141
# File 'lib/internet_message.rb', line 141

defm.call :to

#trace_blocksTraceBlockList

Returns trace block list.

Returns:



162
163
164
165
# File 'lib/internet_message.rb', line 162

def trace_blocks
  parse_header
  @trace_blocks
end

#typeString

Returns media type. ‘text’ if Content-Type field doesn’t exists.

Returns:

  • (String)

    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