EvoBal/app/services/email_importer.rb

107 lines
2.4 KiB
Ruby

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)
values_for_header(mail.header["X-Client-ID"])
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)
values_for_header(mail.header["X-Ticket-ID"])
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