Extraction du mapping des metadonnées dans EmailAction::MetedataMapping
This commit is contained in:
parent
c12bf5af8f
commit
f99723c1f7
|
@ -46,6 +46,14 @@ class Email
|
||||||
mailing_list
|
mailing_list
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def header_values(header_name)
|
||||||
|
headers.select { |header|
|
||||||
|
header["name"] == header_name
|
||||||
|
}.filter_map { |header|
|
||||||
|
header["value"]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def self.find(id)
|
def self.find(id)
|
||||||
EmailRepository.new.find(id)
|
EmailRepository.new.find(id)
|
||||||
end
|
end
|
||||||
|
|
17
app/services/email_action/issue_mapping.rb
Normal file
17
app/services/email_action/issue_mapping.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module EmailAction
|
||||||
|
class IssueMapping < Base
|
||||||
|
|
||||||
|
def process(email)
|
||||||
|
values = ["X-Ticket-Id", "X-Issue-Id"].filter_map { |header_name|
|
||||||
|
email.header_values(header_name)
|
||||||
|
}.flatten.uniq
|
||||||
|
|
||||||
|
email.tickets = values
|
||||||
|
|
||||||
|
email
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
63
app/services/email_action/metadata_mapping.rb
Normal file
63
app/services/email_action/metadata_mapping.rb
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module EmailAction
|
||||||
|
class MetadataMapping < Base
|
||||||
|
|
||||||
|
attr_accessor :metadata_mapping_class
|
||||||
|
|
||||||
|
def initialize(
|
||||||
|
metadata_mapping_class: ::MetadataMapping)
|
||||||
|
|
||||||
|
@metadata_mapping_class = metadata_mapping_class
|
||||||
|
end
|
||||||
|
|
||||||
|
def process(email)
|
||||||
|
metadata_inputs = metadata_inputs(email)
|
||||||
|
metadata = metadata_mapping_class.where(input: metadata_inputs).all
|
||||||
|
|
||||||
|
email.clients = metadata.filter_map(&:entity).uniq
|
||||||
|
email.servers = metadata.filter_map(&:server).uniq
|
||||||
|
|
||||||
|
email
|
||||||
|
rescue => ex
|
||||||
|
binding.pry
|
||||||
|
end
|
||||||
|
|
||||||
|
def metadata_inputs(email)
|
||||||
|
inputs = []
|
||||||
|
# add mail addresses and hostnames from headers
|
||||||
|
inputs << ["To", "Delivered-To", "X-Original-To", "From", "Subject"].filter_map { |header_name|
|
||||||
|
email.header_values(header_name)
|
||||||
|
}.flatten.filter_map() { |header_value|
|
||||||
|
keep_email_and_hostnames(header_value)
|
||||||
|
}.flatten.filter_map() { |value|
|
||||||
|
clean_subdomains(value)
|
||||||
|
}.flatten
|
||||||
|
# add other values from headers
|
||||||
|
inputs << email.header_values("X-Client-Id")
|
||||||
|
|
||||||
|
inputs.flatten.uniq
|
||||||
|
end
|
||||||
|
|
||||||
|
def keep_email_and_hostnames(string)
|
||||||
|
pattern = /\b((?:([-a-zA-Z0-9\._]+)@)?((?:[-a-zA-Z0-9\._]*)(?:\.[a-z]{2,})))\b/
|
||||||
|
results = string.scan(pattern)
|
||||||
|
if results.present?
|
||||||
|
results.map(&:first)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def clean_subdomains(value)
|
||||||
|
[
|
||||||
|
[/[-a-zA-Z0-9\._]+@([-a-zA-Z0-9]+).evolix.net/, '@\1']
|
||||||
|
].filter_map { |item|
|
||||||
|
if value.match?(item[0])
|
||||||
|
value.gsub!(item[0], item[1])
|
||||||
|
else
|
||||||
|
value
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,16 +2,13 @@
|
||||||
|
|
||||||
class EmailImporter
|
class EmailImporter
|
||||||
attr_accessor :email_class
|
attr_accessor :email_class
|
||||||
attr_accessor :metadata_mapping_class
|
|
||||||
attr_accessor :html_to_text_class
|
attr_accessor :html_to_text_class
|
||||||
|
|
||||||
def initialize(
|
def initialize(
|
||||||
email_class: Email,
|
email_class: Email,
|
||||||
metadata_mapping_class: MetadataMapping,
|
|
||||||
html_to_text_class: Rails.configuration.html_to_text_class)
|
html_to_text_class: Rails.configuration.html_to_text_class)
|
||||||
|
|
||||||
@email_class = email_class
|
@email_class = email_class
|
||||||
@metadata_mapping_class = metadata_mapping_class
|
|
||||||
@html_to_text_class = html_to_text_class
|
@html_to_text_class = html_to_text_class
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -24,12 +21,7 @@ class EmailImporter
|
||||||
delivered_to: delivered_to(mail),
|
delivered_to: delivered_to(mail),
|
||||||
from: mail.from,
|
from: mail.from,
|
||||||
plain_body: text_plain_body(mail),
|
plain_body: text_plain_body(mail),
|
||||||
headers: hashed_headers(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
|
rescue => ex
|
||||||
binding.pry
|
binding.pry
|
||||||
|
@ -70,27 +62,6 @@ class EmailImporter
|
||||||
}
|
}
|
||||||
end
|
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)
|
|
||||||
metadata(mail).filter_map(&:entity).uniq
|
|
||||||
end
|
|
||||||
|
|
||||||
def servers(mail)
|
|
||||||
metadata(mail).filter_map(&:server).uniq
|
|
||||||
end
|
|
||||||
|
|
||||||
def tickets(mail)
|
|
||||||
values_from_header(header: mail.header["X-Ticket-Id"])
|
|
||||||
end
|
|
||||||
|
|
||||||
def values_from_header(header:, default: [])
|
def values_from_header(header:, default: [])
|
||||||
if header.respond_to?(:map)
|
if header.respond_to?(:map)
|
||||||
header.map(&:value)
|
header.map(&:value)
|
||||||
|
@ -102,44 +73,4 @@ class EmailImporter
|
||||||
default
|
default
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def metadata(mail)
|
|
||||||
@metadata ||= metadata_mapping_class.where(input: metadata_inputs(mail)).all
|
|
||||||
end
|
|
||||||
|
|
||||||
def metadata_inputs(mail)
|
|
||||||
inputs = []
|
|
||||||
# add mail addresses and hostnames from headers
|
|
||||||
inputs << ["To", "Delivered-To", "X-Original-To", "From", "Subject"].filter_map { |header_name|
|
|
||||||
mail.header[header_name]
|
|
||||||
}.flatten.map(&:value).filter_map() { |header_value|
|
|
||||||
keep_email_and_hostnames(header_value)
|
|
||||||
}.flatten.filter_map() { |value|
|
|
||||||
clean_subdomains(value)
|
|
||||||
}.flatten
|
|
||||||
# add other values from headers
|
|
||||||
inputs << mail.header["X-Client-Id"]
|
|
||||||
|
|
||||||
inputs.uniq
|
|
||||||
end
|
|
||||||
|
|
||||||
def keep_email_and_hostnames(string)
|
|
||||||
pattern = /\b((?:([-a-zA-Z0-9\._]+)@)?((?:[-a-zA-Z0-9\._]*)(?:\.[a-z]{2,})))\b/
|
|
||||||
results = string.scan(pattern)
|
|
||||||
if results.present?
|
|
||||||
results.map(&:first)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def clean_subdomains(value)
|
|
||||||
[
|
|
||||||
[/[-a-zA-Z0-9\._]+@([-a-zA-Z0-9]+).evolix.net/, '@\1']
|
|
||||||
].filter_map { |item|
|
|
||||||
if value.match?(item[0])
|
|
||||||
value.gsub!(item[0], item[1])
|
|
||||||
else
|
|
||||||
value
|
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue