EvoBal/app/services/email_action/metadata_mapping.rb

64 lines
1.6 KiB
Ruby
Raw Normal View History

# 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