In Files

Parent

Class/Module Index [+]

Quicksearch

Mail::Body

Body

The body is where the text of the email is stored. Mail treats the body as a single object. The body itself has no information about boundaries used in the MIME standard, it just looks at it’s content as either a single block of text, or (if it is a multipart message) as an array of blocks o text.

A body has to be told to split itself up into a multipart message by calling split with the correct boundary. This is because the body object has no way of knowing what the correct boundary is for itself (there could be many boundaries in a body in the case of a nested MIME text).

Once split is called, Mail::Body will slice itself up on this boundary, assigning anything that appears before the first part to the preamble, and anything that appears after the closing boundary to the epilogue, then each part gets initialized into a Mail::Part object.

The boundary that is used to split up the Body is also stored in the Body object for use on encoding itself back out to a string. You can overwrite this if it needs to be changed.

On encoding, the body will return the preamble, then each part joined by the boundary, followed by a closing boundary string and then the epilogue.

Public Class Methods

new(string = '') click to toggle source
# File lib/mail/body.rb, line 28
def initialize(string = '')
  @boundary = nil
  @preamble = nil
  @epilogue = nil
  @part_sort_order = [ "text/plain", "text/enriched", "text/html" ]
  @parts = Mail::PartsList.new
  if string.blank?
    @raw_source = ''
  else
    # Do join first incase we have been given an Array in Ruby 1.9
    if string.respond_to?(:join)
      @raw_source = string.join('')
    elsif string.respond_to?(:to_s)
      @raw_source = string.to_s
    else
      raise "You can only assign a string or an object that responds_to? :join or :to_s to a body."
    end
  end
  @encoding = nil
  set_charset
end

Public Instance Methods

<<( val ) click to toggle source
# File lib/mail/body.rb, line 205
def <<( val )
  if @parts
    @parts << val
  else
    @parts = Mail::PartsList.new[val]
  end
end
==(other) click to toggle source

Matches this body with another body. Also matches the decoded value of this body with a string.

Examples:

body = Mail::Body.new('The body')
body == body #=> true

body = Mail::Body.new('The body')
body == 'The body' #=> true

body = Mail::Body.new("VGhlIGJvZHk=\n")
body.encoding = 'base64'
body == "The body" #=> true
# File lib/mail/body.rb, line 64
def ==(other)
  if other.class == String
    self.decoded == other
  else
    super
  end
end
=~(regexp) click to toggle source

Accepts a string and performs a regular expression against the decoded text

Examples:

body = Mail::Body.new('The body')
body =~ /The/ #=> 0

body = Mail::Body.new("VGhlIGJvZHk=\n")
body.encoding = 'base64'
body =~ /The/ #=> 0
# File lib/mail/body.rb, line 82
def =~(regexp)
  self.decoded =~ regexp
end
boundary() click to toggle source

Returns the boundary used by the body

# File lib/mail/body.rb, line 192
def boundary
  @boundary
end
boundary=( val ) click to toggle source

Allows you to change the boundary of this Body object

# File lib/mail/body.rb, line 197
def boundary=( val )
  @boundary = val
end
charset() click to toggle source
# File lib/mail/body.rb, line 150
def charset
  @charset
end
charset=( val ) click to toggle source
# File lib/mail/body.rb, line 154
def charset=( val )
  @charset = val
end
decoded() click to toggle source
# File lib/mail/body.rb, line 138
def decoded
  if encoding.nil? || !Encodings.defined?(encoding)
    raw_source.to_lf
  else
    Encodings.get_encoding(encoding).decode(raw_source)
  end
end
encoded() click to toggle source

Returns a US-ASCII 7-bit compliant body. Right now just returns the raw source. Need to implement

# File lib/mail/body.rb, line 128
def encoded
  if multipart?
    self.sort_parts!
    encoded_parts = parts.map { |p| p.encoded }
    ([preamble] + encoded_parts).join(crlf_boundary) + end_boundary + epilogue.to_s
  else
    raw_source.to_crlf
  end
end
encoding() click to toggle source
# File lib/mail/body.rb, line 158
def encoding
  @encoding
end
encoding=( val ) click to toggle source
# File lib/mail/body.rb, line 162
def encoding=( val )
  @encoding = val
end
epilogue() click to toggle source

Returns the epilogue (any text that is after the last MIME boundary)

# File lib/mail/body.rb, line 177
def epilogue
  @epilogue
end
epilogue=( val ) click to toggle source

Sets the epilogue to a string (adds text after the last mime boundary)

# File lib/mail/body.rb, line 182
def epilogue=( val )
  @epilogue = val
end
match(regexp) click to toggle source

Accepts a string and performs a regular expression against the decoded text

Examples:

body = Mail::Body.new('The body')
body.match(/The/) #=> #<MatchData "The">

body = Mail::Body.new("VGhlIGJvZHk=\n")
body.encoding = 'base64'
body.match(/The/) #=> #<MatchData "The">
# File lib/mail/body.rb, line 96
def match(regexp)
  self.decoded.match(regexp)
end
multipart?() click to toggle source

Returns true if there are parts defined in the body

# File lib/mail/body.rb, line 187
def multipart?
  true unless parts.empty?
end
only_us_ascii?() click to toggle source
# File lib/mail/body.rb, line 224
def only_us_ascii?
  !!raw_source.to_s.ascii_only?
end
parts() click to toggle source
# File lib/mail/body.rb, line 201
def parts
  @parts
end
preamble() click to toggle source

Returns the preamble (any text that is before the first MIME boundary)

# File lib/mail/body.rb, line 167
def preamble
  @preamble
end
preamble=( val ) click to toggle source

Sets the preamble to a string (adds text before the first mime boundary)

# File lib/mail/body.rb, line 172
def preamble=( val )
  @preamble = val
end
raw_source() click to toggle source

Returns the raw source that the body was initialized with, without any tampering

# File lib/mail/body.rb, line 122
def raw_source
  @raw_source
end
set_sort_order(order) click to toggle source

Allows you to set the sort order of the parts, overriding the default sort order. Defaults to ‘text/plain’, then ‘text/enriched’, then ‘text/html’ with any other content type coming after.

# File lib/mail/body.rb, line 103
def set_sort_order(order)
  @part_sort_order = order
end
sort_parts!() click to toggle source

Allows you to sort the parts according to the default sort order, or the sort order you set with :set_sort_order.

sort_parts! is also called from :encode, so there is no need for you to call this explicitly

# File lib/mail/body.rb, line 111
    def sort_parts!
      @parts.each do |p|
        p.body.set_sort_order(@part_sort_order)
        @parts.sort!(@part_sort_order)
        p.body.sort_parts!
      end
#      @parts.sort!(@part_sort_order)
    end
split!(boundary) click to toggle source
# File lib/mail/body.rb, line 213
def split!(boundary)
  self.boundary = boundary
  parts = raw_source.split("--#{boundary}")
  # Make the preamble equal to the preamble (if any)
  self.preamble = parts[0].to_s.strip
  # Make the epilogue equal to the epilogue (if any)
  self.epilogue = parts[-1].to_s.sub('--', '').strip
  parts[1...-1].to_a.each { |part| @parts << Mail::Part.new(part) }
  self
end
to_s() click to toggle source
# File lib/mail/body.rb, line 146
def to_s
  decoded
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.