class Griddler::Email

Attributes

attachments[R]
bcc[R]
body[R]
cc[R]
charsets[R]
from[R]
headers[R]
original_recipient[R]
params[R]
raw_body[R]
raw_headers[R]
raw_html[R]
raw_text[R]
reply_to[R]
spam_report[R]
subject[R]
to[R]
vendor_specific[R]

Public Class Methods

new(params) click to toggle source
# File lib/griddler/email.rb, line 25
def initialize(params)
  @params = params

  @to = recipients(:to)
  @from = extract_address(params[:from])
  @subject = extract_subject

  @body = extract_body
  @raw_text = params[:text]
  @raw_html = params[:html]
  @raw_body = @raw_text.presence || @raw_html

  @headers = extract_headers

  @cc = recipients(:cc)
  @bcc = recipients(:bcc)
  @original_recipient = extract_address(params[:original_recipient])
  @reply_to = extract_address(params[:reply_to])

  @raw_headers = params[:headers]

  @attachments = params[:attachments]

  @vendor_specific = params.fetch(:vendor_specific, {})

  @spam_report = params[:spam_report]

  @charsets = params[:charsets]
end

Public Instance Methods

spam_score() click to toggle source
# File lib/griddler/email.rb, line 76
def spam_score
  @spam_report[:score] if @spam_report
end
to_h() click to toggle source
# File lib/griddler/email.rb, line 55
def to_h
  @to_h ||= {
    to: to,
    from: from,
    cc: cc,
    bcc: bcc,
    subject: subject,
    body: body,
    raw_body: raw_body,
    raw_text: raw_text,
    raw_html: raw_html,
    headers: headers,
    raw_headers: raw_headers,
    attachments: attachments,
    vendor_specific: vendor_specific,
    spam_score: spam_score,
    spam_report: spam_report,
    charsets: charsets,
  }
end

Private Instance Methods

clean_html(html) click to toggle source
# File lib/griddler/email.rb, line 130
def clean_html(html)
  cleaned_html = clean_invalid_utf8_bytes(html)
  cleaned_html = strip_tags(cleaned_html)
  cleaned_html = HTMLEntities.new.decode(cleaned_html)
  cleaned_html
end
clean_invalid_utf8_bytes(text) click to toggle source
# File lib/griddler/email.rb, line 153
def clean_invalid_utf8_bytes(text)
  if text && !text.valid_encoding?
    text.force_encoding('ISO-8859-1').encode('UTF-8')
  else
    text
  end
end
clean_text(text) click to toggle source
# File lib/griddler/email.rb, line 126
def clean_text(text)
  clean_invalid_utf8_bytes(text)
end
config() click to toggle source
# File lib/griddler/email.rb, line 84
def config
  @config ||= Griddler.configuration
end
deep_clean_invalid_utf8_bytes(object) click to toggle source
# File lib/griddler/email.rb, line 137
def deep_clean_invalid_utf8_bytes(object)
  case object
  when Hash
    object.inject({}) do |clean_hash, (key, dirty_value)|
      clean_hash[key] = deep_clean_invalid_utf8_bytes(dirty_value)
      clean_hash
    end
  when Array
    object.map { |element| deep_clean_invalid_utf8_bytes(element) }
  when String
    clean_invalid_utf8_bytes(object)
  else
    object
  end
end
extract_address(address) click to toggle source
# File lib/griddler/email.rb, line 94
def extract_address(address)
  clean_address = clean_text(address)
  EmailParser.parse_address(clean_address) if clean_address =~ /@/
end
extract_body() click to toggle source
# File lib/griddler/email.rb, line 103
def extract_body
  EmailParser.extract_reply_body(text_or_sanitized_html)
end
extract_cc_from_headers(headers) click to toggle source
# File lib/griddler/email.rb, line 117
def extract_cc_from_headers(headers)
  EmailParser.extract_cc(headers)
end
extract_headers() click to toggle source
# File lib/griddler/email.rb, line 107
def extract_headers
  if params[:headers].is_a?(Hash)
    deep_clean_invalid_utf8_bytes(params[:headers])
  elsif params[:headers].is_a?(Array)
    deep_clean_invalid_utf8_bytes(params[:headers])
  else
    EmailParser.extract_headers(clean_invalid_utf8_bytes(params[:headers]))
  end
end
extract_subject() click to toggle source
# File lib/griddler/email.rb, line 99
def extract_subject
  clean_text(params[:subject])
end
recipients(type) click to toggle source
# File lib/griddler/email.rb, line 88
def recipients(type)
  params[type].to_a.reject(&:empty?).map do |recipient|
    extract_address(recipient)
  end.compact
end
text_or_sanitized_html() click to toggle source
# File lib/griddler/email.rb, line 121
def text_or_sanitized_html
  text = clean_text(params.fetch(:text, ''))
  text.presence || clean_html(params.fetch(:html, '')).presence
end