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 # 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 29
29: def initialize(string = '')
30: @boundary = nil
31: @preamble = nil
32: @epilogue = nil
33: @charset = nil
34: @part_sort_order = [ "text/plain", "text/enriched", "text/html" ]
35: @parts = Mail::PartsList.new
36: if string.blank?
37: @raw_source = ''
38: else
39: # Do join first incase we have been given an Array in Ruby 1.9
40: if string.respond_to?(:join)
41: @raw_source = string.join('')
42: elsif string.respond_to?(:to_s)
43: @raw_source = string.to_s
44: else
45: raise "You can only assign a string or an object that responds_to? :join or :to_s to a body."
46: end
47: end
48: @encoding = (only_us_ascii? ? '7bit' : '8bit')
49: set_charset
50: end
# File lib/mail/body.rb, line 245
245: def <<( val )
246: if @parts
247: @parts << val
248: else
249: @parts = Mail::PartsList.new[val]
250: end
251: 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 66
66: def ==(other)
67: if other.class == String
68: self.decoded == other
69: else
70: super
71: end
72: 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 84
84: def =~(regexp)
85: self.decoded =~ regexp
86: end
Returns the boundary used by the body
# File lib/mail/body.rb, line 232
232: def boundary
233: @boundary
234: end
Allows you to change the boundary of this Body object
# File lib/mail/body.rb, line 237
237: def boundary=( val )
238: @boundary = val
239: end
# File lib/mail/body.rb, line 183
183: def charset
184: @charset
185: end
# File lib/mail/body.rb, line 187
187: def charset=( val )
188: @charset = val
189: end
# File lib/mail/body.rb, line 171
171: def decoded
172: if !Encodings.defined?(encoding)
173: raise UnknownEncodingType, "Don't know how to decode #{encoding}, please call #encoded and decode it yourself."
174: else
175: Encodings.get_encoding(encoding).decode(raw_source)
176: end
177: end
# File lib/mail/body.rb, line 269
269: def empty?
270: !!raw_source.to_s.empty?
271: end
Returns a body encoded using transfer_encoding. Multipart always uses an identiy encoding (i.e. no encoding). Calling this directly is not a good idea, but supported for compatibility TODO: Validate that preamble and epilogue are valid for requested encoding
# File lib/mail/body.rb, line 151
151: def encoded(transfer_encoding = '8bit')
152: if multipart?
153: self.sort_parts!
154: encoded_parts = parts.map { |p| p.encoded }
155: ([preamble] + encoded_parts).join(crlf_boundary) + end_boundary + epilogue.to_s
156: else
157: be = get_best_encoding(transfer_encoding)
158: dec = Mail::Encodings::get_encoding(encoding)
159: enc = Mail::Encodings::get_encoding(be)
160: if transfer_encoding == encoding and dec.nil?
161: # Cannot decode, so skip normalization
162: raw_source
163: else
164: # Decode then encode to normalize and allow transforming
165: # from base64 to Q-P and vice versa
166: enc.encode(dec.decode(raw_source))
167: end
168: end
169: end
# File lib/mail/body.rb, line 191
191: def encoding(val = nil)
192: if val
193: self.encoding = val
194: else
195: @encoding
196: end
197: end
# File lib/mail/body.rb, line 199
199: def encoding=( val )
200: if val == "text" || val.blank? then
201: val = "8bit"
202: end
203: @encoding = (val == "text") ? "8bit" : val
204: end
Returns the epilogue (any text that is after the last MIME boundary)
# File lib/mail/body.rb, line 217
217: def epilogue
218: @epilogue
219: end
Sets the epilogue to a string (adds text after the last MIME boundary)
# File lib/mail/body.rb, line 222
222: def epilogue=( val )
223: @epilogue = val
224: end
# File lib/mail/body.rb, line 142
142: def get_best_encoding(target)
143: target_encoding = Mail::Encodings.get_encoding(target)
144: target_encoding.get_best_compatible(encoding, raw_source)
145: end
Accepts anything that responds to # and checks if it’s a substring of the decoded text
Examples:
body = Mail::Body.new('The body')
body.include?('The') #=> true
body = Mail::Body.new("VGhlIGJvZHk=\n")
body.encoding = 'base64'
body.include?('The') #=> true
# File lib/mail/body.rb, line 112
112: def include?(other)
113: self.decoded.include?(other.to_s)
114: 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 98
98: def match(regexp)
99: self.decoded.match(regexp)
100: end
Returns true if there are parts defined in the body
# File lib/mail/body.rb, line 227
227: def multipart?
228: true unless parts.empty?
229: end
# File lib/mail/body.rb, line 264
264: def only_us_ascii?
265: raw_source.each_byte {|b| return false if (b == 0 || b > 127)}
266: true
267: end
# File lib/mail/body.rb, line 241
241: def parts
242: @parts
243: end
Returns the preamble (any text that is before the first MIME boundary)
# File lib/mail/body.rb, line 207
207: def preamble
208: @preamble
209: end
Sets the preamble to a string (adds text before the first MIME boundary)
# File lib/mail/body.rb, line 212
212: def preamble=( val )
213: @preamble = val
214: end
Returns the raw source that the body was initialized with, without any tampering
# File lib/mail/body.rb, line 138
138: def raw_source
139: @raw_source
140: 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 119
119: def set_sort_order(order)
120: @part_sort_order = order
121: 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 127
127: def sort_parts!
128: @parts.each do |p|
129: p.body.set_sort_order(@part_sort_order)
130: @parts.sort!(@part_sort_order)
131: p.body.sort_parts!
132: end
133: # @parts.sort!(@part_sort_order)
134: end
# File lib/mail/body.rb, line 253
253: def split!(boundary)
254: self.boundary = boundary
255: parts = raw_source.split("--#{boundary}")
256: # Make the preamble equal to the preamble (if any)
257: self.preamble = parts[0].to_s.strip
258: # Make the epilogue equal to the epilogue (if any)
259: self.epilogue = parts[1].to_s.sub('--', '').strip
260: parts[1...1].to_a.each { |part| @parts << Mail::Part.new(part) }
261: self
262: end
# File lib/mail/body.rb, line 275
275: def crlf_boundary
276: "\r\n\r\n--#{boundary}\r\n"
277: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.