2020-10-17 12:46:09 +02:00
|
|
|
class InMailbox < ApplicationMailbox
|
|
|
|
def process
|
2020-10-28 23:53:42 +01:00
|
|
|
|
2020-12-27 11:45:53 +01:00
|
|
|
email = Email.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)
|
|
|
|
)
|
|
|
|
|
2020-12-28 00:53:14 +01:00
|
|
|
repository = EmailRepository.new
|
|
|
|
repository.save(email)
|
2020-12-27 11:45:53 +01:00
|
|
|
rescue => ex
|
|
|
|
binding.pry
|
|
|
|
end
|
2020-10-28 23:53:42 +01:00
|
|
|
|
2020-12-27 11:45:53 +01:00
|
|
|
def delivered_to(mail)
|
2020-12-28 00:53:01 +01:00
|
|
|
header = mail.header["Delivered-To"]
|
|
|
|
if header.present?
|
|
|
|
if header.respond_to?(:map)
|
|
|
|
header.map(&:value)
|
|
|
|
else
|
|
|
|
header.value
|
|
|
|
end
|
2020-12-27 11:45:53 +01:00
|
|
|
else
|
|
|
|
mail.to
|
|
|
|
end
|
2020-10-17 12:46:09 +02:00
|
|
|
end
|
2020-10-28 23:53:42 +01:00
|
|
|
|
|
|
|
def text_plain_body(mail)
|
|
|
|
if mail.parts.present?
|
2020-12-28 00:52:20 +01:00
|
|
|
mail.text_part.decoded
|
2020-10-28 23:53:42 +01:00
|
|
|
else
|
|
|
|
mail.decoded
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-12-27 11:45:53 +01:00
|
|
|
def hashed_headers(mail)
|
|
|
|
mail.header.map { |h|
|
|
|
|
{
|
|
|
|
name: h.name,
|
|
|
|
value: h.value
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2020-10-28 23:53:42 +01:00
|
|
|
def sent_by_cron?(mail)
|
|
|
|
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)
|
2020-12-27 11:45:53 +01:00
|
|
|
Array(mail.header["X-Client-ID"].value) if mail.header["X-Client-ID"].present?
|
2020-10-28 23:53:42 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def servers(mail)
|
|
|
|
if mail.header["X-Server-Name"].present?
|
2020-12-27 11:45:53 +01:00
|
|
|
Array(mail.header["X-Server-Name"].value)
|
2020-10-28 23:53:42 +01:00
|
|
|
else
|
|
|
|
matching_header = ["To", "Delivered-To", "From", "Subject"].detect { |header_name|
|
2020-12-27 11:45:53 +01:00
|
|
|
address_match_evolix_net?(mail.header[header_name].value) if mail.header[header_name].present?
|
2020-10-28 23:53:42 +01:00
|
|
|
}
|
2020-12-27 11:45:53 +01:00
|
|
|
Array(extract_server_name_from_address(mail.header[matching_header].value)) if matching_header
|
2020-10-28 23:53:42 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def tickets(mail)
|
2020-12-27 11:45:53 +01:00
|
|
|
Array(mail.header["X-Ticket-ID"].value) if mail.header["X-Ticket-ID"].present?
|
2020-10-28 23:53:42 +01:00
|
|
|
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
|
|
|
|
|
2020-10-17 12:46:09 +02:00
|
|
|
end
|