diff --git a/app/interactions/actions/email_check.rb b/app/interactions/actions/email_check.rb index 4b026ec2e..cf0ceaa55 100644 --- a/app/interactions/actions/email_check.rb +++ b/app/interactions/actions/email_check.rb @@ -50,6 +50,8 @@ module Actions end def save_result(result) + contacts = Contact.where(email: email) + if !result.success && @check_level == "mx" result_validation = Actions::AAndAaaaEmailValidation.call(email: @email, value: 'A') output_a_and_aaaa_validation_results(email: @email, @@ -62,9 +64,10 @@ module Actions type: 'AAAA') result_validation.present? ? result.success = true : result.success = false - validation_eventable.validation_events.create(validation_event_attrs(result)) - else - validation_eventable.validation_events.create(validation_event_attrs(result)) + end + + contacts.each do |contact| + contact.validation_events.create(validation_event_attrs(result)) end rescue ActiveRecord::RecordNotSaved logger.info "Cannot save validation result for #{log_object_id}" diff --git a/app/jobs/verify_emails_job.rb b/app/jobs/verify_emails_job.rb index 4b9b98fb7..6c75aa22c 100644 --- a/app/jobs/verify_emails_job.rb +++ b/app/jobs/verify_emails_job.rb @@ -1,8 +1,13 @@ class VerifyEmailsJob < ApplicationJob discard_on StandardError - def perform(contact:, check_level: 'mx') - contact_not_found(contact.id) unless contact + def perform(email:, check_level: 'mx') + # contact_not_found(contact.id) unless contact + + contact = Contact.find_by_email(email) + + return unless filter_check_level(contact) + validate_check_level(check_level) action = Actions::EmailCheck.new(email: contact.email, validation_eventable: contact, @@ -32,4 +37,24 @@ class VerifyEmailsJob < ApplicationJob def valid_check_levels ValidationEvent::VALID_CHECK_LEVELS end + + def get_validation_results(contact) + ValidationEvent.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) + end + + def filter_check_level(contact) + return true unless contact.validation_events.exists? + + data = contact.validation_events.order(created_at: :asc).last + + return true if data.successful? && data.created_at < (Time.zone.now - ValidationEvent::VALIDATION_PERIOD) + + if data.failed? + return false if data.event_data['check_level'] == 'regex' + + return true + end + + false + end end diff --git a/lib/tasks/verify_email.rake b/lib/tasks/verify_email.rake index c22587ab1..d20ac76a1 100644 --- a/lib/tasks/verify_email.rake +++ b/lib/tasks/verify_email.rake @@ -19,17 +19,28 @@ namespace :verify_email do banner: banner, hash: opts_hash) - batch_contacts = prepare_contacts(options) - logger.info 'No contacts to check email selected' and next if batch_contacts.blank? + # batch_contacts = prepare_contacts(options) + # logger.info 'No contacts to check email selected' and next if batch_contacts.blank? - batch_contacts.find_in_batches(batch_size: 10_000) do |contacts| - contacts.each do |contact| + # batch_contacts.find_in_batches(batch_size: 10_000) do |contacts| + # contacts.each do |contact| + # VerifyEmailsJob.set(wait_until: spam_protect_timeout(options)).perform_later( + # contact: contact, + # check_level: check_level(options) + # ) if filter_check_level(contact) + # end + # end + + email_contacts = prepare_contacts(options) + email_contacts.each do |email| VerifyEmailsJob.set(wait_until: spam_protect_timeout(options)).perform_later( - contact: contact, + # contact: contact, + email: email, check_level: check_level(options) - ) if filter_check_level(contact) - end + ) + # if filter_check_level(contact) end + end end @@ -51,13 +62,16 @@ end def prepare_contacts(options) if options[:domain_name].present? - contacts_by_domain(options[:domain_name]) + Rails.logger.info 'NEED TO TODO' + # contacts_by_domain(options[:domain_name]) else time = Time.zone.now - ValidationEvent::VALIDATION_PERIOD validation_events_ids = ValidationEvent.where('created_at > ?', time).distinct.pluck(:validation_eventable_id) contacts_ids = Contact.where.not(id: validation_events_ids).pluck(:id) - Contact.where(id: contacts_ids + failed_contacts) + Contact.where(id: contacts_ids + failed_contacts).group_by(&:email).keys + + # Contact.all.group_by(&:email).keys end end @@ -71,10 +85,6 @@ def filter_check_level(contact) if data.failed? return false if data.event_data['check_level'] == 'regex' - # return false if data.event_data['check_level'] == 'smtp' - # - # return false if check_mx_contact_validation(contact) - return true end @@ -92,14 +102,6 @@ def failed_contacts failed_contacts.uniq end -# def check_mx_contact_validation(contact) -# data = contact.validation_events.mx.order(created_at: :asc).last(ValidationEvent::MX_CHECK) -# -# return false if data.size < ValidationEvent::MX_CHECK -# -# data.all? { |d| d.failed? } -# end - def contacts_by_domain(domain_name) domain = ::Domain.find_by(name: domain_name) return unless domain