class InMailbox < ApplicationMailbox def process 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) ) repository = EmailRepository.new repository.save(email) rescue => ex binding.pry end def delivered_to(mail) header = mail.header["Delivered-To"] if header.present? if header.respond_to?(:map) header.map(&:value) else header.value end else mail.to end end def text_plain_body(mail) if mail.parts.present? mail.text_part.decoded else mail.decoded end end def hashed_headers(mail) mail.header.map { |h| { name: h.name, value: h.value } } end 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) Array(mail.header["X-Client-ID"].value) if mail.header["X-Client-ID"].present? end def servers(mail) if mail.header["X-Server-Name"].present? Array(mail.header["X-Server-Name"].value) else matching_header = ["To", "Delivered-To", "From", "Subject"].detect { |header_name| address_match_evolix_net?(mail.header[header_name].value) if mail.header[header_name].present? } Array(extract_server_name_from_address(mail.header[matching_header].value)) if matching_header end end def tickets(mail) Array(mail.header["X-Ticket-ID"].value) if mail.header["X-Ticket-ID"].present? 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 end