64 lines
1.6 KiB
Ruby
64 lines
1.6 KiB
Ruby
|
# 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
|