class Rexlite::MIME::Message

Attributes

bound[RW]
content[RW]
header[RW]
parts[RW]

Public Class Methods

new(data=nil) click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 14
def initialize(data=nil)
  self.header = Rexlite::MIME::Header.new
  self.parts  = []
  self.bound  = "_Part_#{rand(1024)}_#{rand(0xffffffff)}_#{rand(0xffffffff)}"
  self.content = ''
  if data
    head,body = data.split(/\r?\n\r?\n/, 2)

    self.header.parse(head)
    ctype = self.header.find('Content-Type')

    if ctype && ctype[1] && ctype[1] =~ /multipart\/mixed;\s*boundary="?([A-Za-z0-9'\(\)\+\_,\-\.\/:=\?^\s]+)"?/
      self.bound = $1
      chunks = body.to_s.split(/--#{self.bound}(--)?\r?\n/)
      self.content = chunks.shift.to_s.gsub(/\s+$/, '')
      self.content << "\r\n" unless self.content.empty?

      chunks.each do |chunk|
        break if chunk == "--"
        head,body = chunk.split(/\r?\n\r?\n/, 2)
        part = Rexlite::MIME::Part.new
        part.header.parse(head)
        part.content = body.gsub(/\s+$/, '')
        self.parts << part
      end
    else
      self.content = body.to_s.gsub(/\s+$/, '') + "\r\n"
    end
  end
end

Public Instance Methods

add_part(data='', content_type='text/plain', transfer_encoding="8bit", content_disposition=nil) click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 100
def add_part(data='', content_type='text/plain', transfer_encoding="8bit", content_disposition=nil)
  part = Rexlite::MIME::Part.new

  if content_disposition
    part.header.set("Content-Disposition", content_disposition)
  end

  part.header.set("Content-Type", content_type) if content_type

  if transfer_encoding
    part.header.set("Content-Transfer-Encoding", transfer_encoding)
  end

  part.content = data
  self.parts << part
  part
end
add_part_attachment(data, name) click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 118
def add_part_attachment(data, name)
  self.add_part(
    encode_base64(data, "\r\n"),
    "application/octet-stream; name=\"#{name}\"",
    "base64",
    "attachment; filename=\"#{name}\""
  )
end
add_part_inline_attachment(data, name) click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 128
def add_part_inline_attachment(data, name)
  self.add_part(
    encode_base64(data, "\r\n"),
    "application/octet-stream; name=\"#{name}\"",
    "base64",
    "inline; filename=\"#{name}\""
  )
end
encode_base64(str, delim='') click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 137
def encode_base64(str, delim='')
  [str.to_s].pack("m").gsub(/\s+/, delim)
end
from() click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 57
def from
  (self.header.find('From') || [nil, nil])[1]
end
from=(val) click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 53
def from=(val)
  self.header.set("From", val)
end
mime_defaults() click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 69
def mime_defaults
  self.header.set("MIME-Version", "1.0")
  self.header.set("Content-Type", "multipart/mixed; boundary=\"#{self.bound}\"")
  self.header.set("Subject", '') # placeholder
  self.header.set("Date", Time.now.strftime("%a,%e %b %Y %H:%M:%S %z"))
  self.header.set("Message-ID",
                  "<"+
                  rand_text_alphanumeric(rand(20)+40)+
                  "@"+
                  rand_text_alpha(rand(20)+3)+
                  ">"
                  )
  self.header.set("From", '')    # placeholder
  self.header.set("To", '')      # placeholder
end
rand_text_alpha(len, bad='') click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 93
def rand_text_alpha(len, bad='')
  foo = []
  foo += ('A' .. 'Z').to_a
  foo += ('a' .. 'z').to_a
  rand_base(len, bad, *foo )
end
rand_text_alphanumeric(len, bad='') click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 85
def rand_text_alphanumeric(len, bad='')
  foo = []
  foo += ('A' .. 'Z').to_a
  foo += ('a' .. 'z').to_a
  foo += ('0' .. '9').to_a
  rand_base(len, bad, *foo )
end
subject() click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 65
def subject
  (self.header.find('Subject') || [nil, nil])[1]
end
subject=(val) click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 61
def subject=(val)
  self.header.set("Subject", val)
end
to() click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 45
def to
  (self.header.find('To') || [nil, nil])[1]
end
to=(val) click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 49
def to=(val)
  self.header.set("To", val)
end
to_s() click to toggle source
# File lib/nexpose/rexlite/mime/message.rb, line 142
def to_s
  header_string = self.header.to_s

  msg = header_string.empty? ? '' : force_crlf(self.header.to_s + "\r\n")
  msg << force_crlf(self.content + "\r\n") unless self.content.empty?

  self.parts.each do |part|
    msg << force_crlf("--" + self.bound + "\r\n")
    msg << part.to_s
  end

  msg << force_crlf("--" + self.bound + "--\r\n") if self.parts.length > 0

  msg
end