class EmailImporter attr_accessor :klass def initialize(klass = Email) @klass = klass end def import(mail) email = klass.new( message_id: mail.message_id, subject: mail.subject, date: mail.date, to: mail.to, delivered_to: delivered_to(mail), from: mail.from, plain_body: text_plain_body(mail), headers: hashed_headers(mail), cron: sent_by_cron?(mail), mailing_list: mailing_list?(mail), clients: clients(mail), servers: servers(mail), tickets: tickets(mail) ) rescue => ex binding.pry end def delivered_to(mail) header = mail.header["Delivered-To"] if header.respond_to?(:map) header.map(&:value) elsif header.respond_to?(:value) header.value else mail.to end end def text_plain_body(mail) if mail.parts.present? if mail.text_part.present? mail.text_part.decoded elsif mail.html_part.present? Nokogiri::HTML(mail.html_part.decoded).text else mail.parts[0].decoded end elsif mail.content_type.match?(/text\/html/) Nokogiri::HTML(mail.body.decoded).text else mail.body.decoded end end def hashed_headers(mail) mail.header.map { |header| { name: header.name, value: header.value } } end def sent_by_cron?(mail) (mail.subject.present? && mail.subject.match?(/cron/i)) \ || mail.header["X-Cron-Env"].present? end def mailing_list?(mail) mail.header["List-Unsubscribe"].present? end def clients(mail) header = mail.header["X-Client-Id"] if header.respond_to?(:map) header.map(&:value) elsif header.respond_to?(:value) header.value end end def servers(mail) ["To", "Delivered-To", "From", "Subject"].filter_map() { |header| mail.header[header] }.flatten.map(&:value).select { |text| if address_match_evolix_net?(text) extract_server_name_from_address(text) end } end def tickets(mail) header = mail.header["X-Ticket-Id"] if header.respond_to?(:map) header.map(&:value) elsif header.respond_to?(:value) header.value end end def address_match_evolix_net?(address) address.match?(/@(.+)\.evolix\.net/i) end def extract_server_name_from_address(address) address.match(/@(.+)\.evolix\.net/i)[1] end def values_for_header(header) if header.present? if header.respond_to?(:map) header.map(&:value) else header.value end end end end