diff --git a/app/interactions/domains/expire_period/process_expired.rb b/app/interactions/domains/expire_period/process_expired.rb index 595de1228..110eb69bc 100644 --- a/app/interactions/domains/expire_period/process_expired.rb +++ b/app/interactions/domains/expire_period/process_expired.rb @@ -11,7 +11,11 @@ module Domains saved = domain.save(validate: false) - DomainExpireEmailJob.enqueue(domain.id, run_at: send_time) if saved + return unless saved + + recipients.each do |recipient| + DomainExpireEmailJob.enqueue(domain.id, recipient, run_at: send_time) + end end def set_graceful_expired @@ -23,6 +27,23 @@ module Domains def send_time domain.valid_to + Setting.expiration_reminder_mail.to_i.days end + + def recipients + filter_invalid_emails(domain.expired_domain_contact_emails) + end + + def filter_invalid_emails(emails) + emails.select do |email| + valid = Truemail.valid?(email) + + unless valid + logger.info('Unable to send DomainExpireMailer#expired email for'\ + "domain #{domain.name} (##{domain.id}) to invalid recipient #{email}") + end + + valid + end + end end end end diff --git a/app/jobs/domain_expire_email_job.rb b/app/jobs/domain_expire_email_job.rb index 94bd8670c..286fe29ab 100644 --- a/app/jobs/domain_expire_email_job.rb +++ b/app/jobs/domain_expire_email_job.rb @@ -1,13 +1,19 @@ class DomainExpireEmailJob < Que::Job - def run(domain_id) + def run(domain_id, email) domain = Domain.find(domain_id) return if domain.registered? + attrs = { + domain: domain, + registrar: domain.registrar, + email: email, + } + if domain.force_delete_scheduled? - DomainExpireMailer.expired_soft(domain: domain, registrar: domain.registrar).deliver_now + DomainExpireMailer.expired_soft(attrs).deliver_now else - DomainExpireMailer.expired(domain: domain, registrar: domain.registrar).deliver_now + DomainExpireMailer.expired(attrs).deliver_now end end end diff --git a/app/mailers/domain_expire_mailer.rb b/app/mailers/domain_expire_mailer.rb index 958e8c1c1..840433e14 100644 --- a/app/mailers/domain_expire_mailer.rb +++ b/app/mailers/domain_expire_mailer.rb @@ -1,23 +1,23 @@ class DomainExpireMailer < ApplicationMailer - attr_accessor :domain, :registrar + attr_accessor :domain, :registrar, :email - def expired(domain:, registrar:) - process_mail(domain: domain, registrar: registrar, method_name: __method__.to_s) + def expired(domain:, registrar:, email:) + process_mail(domain: domain, registrar: registrar, email: email, method_name: __method__.to_s) end - def expired_soft(domain:, registrar:) - process_mail(domain: domain, registrar: registrar, method_name: __method__.to_s) + def expired_soft(domain:, registrar:, email:) + process_mail(domain: domain, registrar: registrar, email: email, method_name: __method__.to_s) end private - def process_mail(domain:, registrar:, method_name:) + def process_mail(domain:, registrar:, email:, method_name:) init(domain, registrar) logger.info("Send DomainExpireMailer##{method_name} email for #{domain.name} (##{domain.id})" \ - " to #{recipient(domain).join(', ')}") + " to #{email}") - mail(to: recipient(domain), subject: subject(method_name)) + mail(to: email, subject: subject(method_name)) end def init(domain, registrar) @@ -25,10 +25,6 @@ class DomainExpireMailer < ApplicationMailer @registrar = registrar_presenter(registrar: registrar) end - def recipient(domain) - filter_invalid_emails(emails: domain.primary_contact_emails, domain: @domain) - end - def subject(method_name) I18n.t("domain_expire_mailer.#{method_name}.subject", domain_name: @domain.name) end @@ -40,23 +36,4 @@ class DomainExpireMailer < ApplicationMailer def registrar_presenter(registrar:) RegistrarPresenter.new(registrar: registrar, view: view_context) end - - # Needed because there are invalid emails in the database, which have been imported from legacy app - def filter_invalid_emails(emails:, domain:) - old_validation_type = Truemail.configure.default_validation_type - Truemail.configure.default_validation_type = :regex - - results = emails.select do |email| - valid = Truemail.valid?(email) - - unless valid - logger.info("Unable to send DomainExpireMailer#expired email for domain #{domain.name} (##{domain.id})" \ - " to invalid recipient #{email}") - end - - valid - end - Truemail.configure.default_validation_type = old_validation_type - results - end end diff --git a/app/models/domain.rb b/app/models/domain.rb index 657688016..ac0855da3 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -632,6 +632,12 @@ class Domain < ApplicationRecord (admin_contacts.emails + [registrant.email]).uniq end + def expired_domain_contact_emails + force_delete_contact_emails.reject do |email| + BouncedMailAddress.where(email: email).count.positive? + end + end + def force_delete_contact_emails (primary_contact_emails + tech_contacts.pluck(:email) + ["info@#{name}", "#{prepared_domain_name}@#{name}"]).uniq diff --git a/test/interactions/expire_period/start_test.rb b/test/interactions/expire_period/start_test.rb index 168b255bb..32fc2125a 100644 --- a/test/interactions/expire_period/start_test.rb +++ b/test/interactions/expire_period/start_test.rb @@ -14,7 +14,9 @@ class StartTest < ActiveSupport::TestCase QueJob.where("args->>0 = '#{@domain.id}'", job_class: DomainExpireEmailJob.name).count end - assert_difference job_count, 1 do + one_job_per_contact_email = @domain.expired_domain_contact_emails.count + + assert_difference job_count, one_job_per_contact_email do perform_enqueued_jobs do DomainCron.start_expire_period end diff --git a/test/jobs/domain_expire_email_job_test.rb b/test/jobs/domain_expire_email_job_test.rb index f57de2686..0bde50b51 100644 --- a/test/jobs/domain_expire_email_job_test.rb +++ b/test/jobs/domain_expire_email_job_test.rb @@ -6,10 +6,11 @@ class DomainExpireEmailJobTest < ActiveSupport::TestCase travel_to Time.zone.parse('2010-08-06') @domain.update(valid_to: Time.now - 1.day) @domain.reload + @email = @domain.registrant.email end def test_domain_expire - success = DomainExpireEmailJob.run(@domain.id) + success = DomainExpireEmailJob.run(@domain.id, @email) assert success end @@ -18,7 +19,7 @@ class DomainExpireEmailJobTest < ActiveSupport::TestCase @domain.reload assert_equal ['serverForceDelete'], @domain.statuses - success = DomainExpireEmailJob.run(@domain.id) + success = DomainExpireEmailJob.run(@domain.id, @email) assert success statuses = @domain.statuses @@ -26,4 +27,4 @@ class DomainExpireEmailJobTest < ActiveSupport::TestCase @domain.update(statuses: statuses) assert_equal ['ok'], @domain.statuses end -end \ No newline at end of file +end diff --git a/test/mailers/domain_expire_mailer_test.rb b/test/mailers/domain_expire_mailer_test.rb index c36c3d80e..ba7c75b61 100644 --- a/test/mailers/domain_expire_mailer_test.rb +++ b/test/mailers/domain_expire_mailer_test.rb @@ -3,9 +3,12 @@ require 'test_helper' class DomainExpireMailerTest < ActionMailer::TestCase def test_delivers_domain_expiration_email domain = domains(:shop) + email = domain.registrar.email assert_equal 'shop.test', domain.name - email = DomainExpireMailer.expired(domain: domain, registrar: domain.registrar).deliver_now + email = DomainExpireMailer.expired(domain: domain, + registrar: domain.registrar, + email: email).deliver_now assert_emails 1 assert_equal I18n.t("domain_expire_mailer.expired.subject", domain_name: domain.name), @@ -14,9 +17,12 @@ class DomainExpireMailerTest < ActionMailer::TestCase def test_delivers_domain_expiration_soft_email domain = domains(:shop) + email = domain.registrar.email assert_equal 'shop.test', domain.name - email = DomainExpireMailer.expired_soft(domain: domain, registrar: domain.registrar).deliver_now + email = DomainExpireMailer.expired_soft(domain: domain, + registrar: domain.registrar, + email: email).deliver_now assert_emails 1 assert_equal I18n.t("domain_expire_mailer.expired_soft.subject", domain_name: domain.name), @@ -25,6 +31,7 @@ class DomainExpireMailerTest < ActionMailer::TestCase def test_delivers_domain_expiration_soft_email_if_auto_fd domain = domains(:shop) + email_address = domain.registrar.email assert_not domain.force_delete_scheduled? travel_to Time.zone.parse('2010-07-05') email = 'some@strangesentence@internet.ee' @@ -41,7 +48,9 @@ class DomainExpireMailerTest < ActionMailer::TestCase assert domain.force_delete_scheduled? - email = DomainExpireMailer.expired_soft(domain: domain, registrar: domain.registrar).deliver_now + email = DomainExpireMailer.expired_soft(domain: domain, + registrar: domain.registrar, + email: email_address).deliver_now assert_emails 1 assert_equal I18n.t("domain_expire_mailer.expired_soft.subject", domain_name: domain.name),