2021-01-20 13:46:45 +01:00
|
|
|
# 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
|
|
|
|
|
2021-01-20 14:09:02 +01:00
|
|
|
private
|
|
|
|
|
2021-01-20 13:46:45 +01:00
|
|
|
def metadata_inputs(email)
|
|
|
|
inputs = []
|
2021-01-20 14:09:02 +01:00
|
|
|
|
2021-01-20 13:46:45 +01:00
|
|
|
# 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
|
2021-01-20 14:09:02 +01:00
|
|
|
|
2021-01-20 13:46:45 +01:00
|
|
|
# add other values from headers
|
2021-01-20 14:09:02 +01:00
|
|
|
inputs << ["X-Client-Id", "X-Entity-Id"].filter_map { |header_name|
|
|
|
|
email.header_values(header_name)
|
|
|
|
}.flatten.uniq
|
2021-01-20 13:46:45 +01:00
|
|
|
|
|
|
|
inputs.flatten.uniq
|
|
|
|
end
|
|
|
|
|
|
|
|
def keep_email_and_hostnames(string)
|
2021-01-20 14:09:02 +01:00
|
|
|
results = string.scan(email_and_hostnames_pattern)
|
|
|
|
|
2021-01-20 13:46:45 +01:00
|
|
|
if results.present?
|
|
|
|
results.map(&:first)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def clean_subdomains(value)
|
2021-01-20 14:09:02 +01:00
|
|
|
clean_subdomains_patterns.filter_map { |pattern|
|
|
|
|
if value.match?(pattern[:search])
|
|
|
|
value.gsub!(pattern[:search], pattern[:replace])
|
2021-01-20 13:46:45 +01:00
|
|
|
else
|
|
|
|
value
|
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2021-01-20 14:09:02 +01:00
|
|
|
def email_and_hostnames_pattern
|
|
|
|
/\b((?:([-a-zA-Z0-9\._]+)@)?((?:[-a-zA-Z0-9\._]*)(?:\.[a-z]{2,})))\b/
|
|
|
|
end
|
|
|
|
|
|
|
|
def clean_subdomains_patterns
|
|
|
|
[{
|
|
|
|
search: /[-a-zA-Z0-9\._]+@([-a-zA-Z0-9]+).evolix.net/,
|
|
|
|
replace: '@\1'
|
|
|
|
}]
|
|
|
|
end
|
|
|
|
|
2021-01-20 13:46:45 +01:00
|
|
|
end
|
|
|
|
end
|