diff --git a/lib/tasks/collect_invalid_validation_contacts.rake b/lib/tasks/collect_invalid_validation_contacts.rake new file mode 100644 index 000000000..227c6a2b5 --- /dev/null +++ b/lib/tasks/collect_invalid_validation_contacts.rake @@ -0,0 +1,78 @@ +namespace :collect_invalid_contacts do + desc 'Starts collect invalid validation contacts' + task all_domains: :environment do + prepare_csv_file + + Contact.all.each do |contact| + email = convert_to_unicode(contact.email) + result = Truemail.validate(email, with: :mx) + + collect_data_for_csv(contact, result.result) unless result.result.success + end + end +end + +def find_related_domains(contact) + registrant_domains = Domain.where(registrant_id: contact.id) + + tech_domains = collect_tech_domains(contact) + admin_domains = collect_admin_domains(contact) + + tech_domains | admin_domains | registrant_domains +end + +def collect_admin_domains(contact) + admin_domains = [] + + admin_contacts = AdminDomainContact.where(contact_id: contact.id) + admin_contacts.each do |c| + admin_domains << Domain.find(c.domain_id) + end + + admin_domains +end + +def collect_tech_domains(contact) + tech_domains = [] + + tech_contacts = TechDomainContact.where(contact_id: contact.id) + tech_contacts.each do |c| + tech_domains << Domain.find(c.domain_id) + end + + tech_domains +end + +def collect_data_for_csv(contact, result) + domains = find_related_domains(contact) + domains.reject! { |dom| dom.statuses.include? DomainStatus::FORCE_DELETE } + + CSV.open('invalid_emails.csv', 'a') do |csv| + domains.each do |domain| + attrs = [] + attrs.push(domain.name, contact.email, result.errors) + + csv << attrs + end + end +end + +def prepare_csv_file + headers = %w[ + contact + domain + error + ] + csv = CSV.open('invalid_emails.csv', 'w') + csv << headers +end + +def convert_to_unicode(email) + original_domain = Mail::Address.new(email).domain + decoded_domain = SimpleIDN.to_unicode(original_domain) + + original_local = Mail::Address.new(email).local + decoded_local = SimpleIDN.to_unicode(original_local) + + "#{decoded_local}@#{decoded_domain}" +end