Object
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.
# 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
# File lib/mail/body.rb, line 205 def <<( val ) if @parts @parts << val else @parts = Mail::PartsList.new[val] end end
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
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
Returns the boundary used by the body
# File lib/mail/body.rb, line 192 def boundary @boundary end
Allows you to change the boundary of this Body object
# File lib/mail/body.rb, line 197 def boundary=( val ) @boundary = val end
# File lib/mail/body.rb, line 154 def charset=( val ) @charset = val end
# 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
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
# File lib/mail/body.rb, line 162 def encoding=( val ) @encoding = val end
Returns the epilogue (any text that is after the last MIME boundary)
# File lib/mail/body.rb, line 177 def epilogue @epilogue end
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
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
Returns true if there are parts defined in the body
# File lib/mail/body.rb, line 187 def multipart? true unless parts.empty? end
# File lib/mail/body.rb, line 224 def only_us_ascii? !!raw_source.to_s.ascii_only? end
Returns the preamble (any text that is before the first MIME boundary)
# File lib/mail/body.rb, line 167 def preamble @preamble end
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
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
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
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
# 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
Generated with the Darkfish Rdoc Generator 2.