Project

General

Profile

Defect #44300 » mailer_with_deliveries_v2.patch

Vincent Robert, 2026-10-05 09:01

View differences:

app/models/mailer.rb
31 31
  class DeliveryJob < ActionMailer::MailDeliveryJob
32 32
    include Redmine::JobWrapper
33 33

  
34
    before_enqueue {throw :abort unless Mailer.perform_deliveries?}
35

  
34 36
    around_enqueue :keep_current_user
35 37
  end
36 38

  
39
  class CurrentDeliveries < ActiveSupport::CurrentAttributes
40
    attribute :disabled
41
  end
42

  
37 43
  self.delivery_job = DeliveryJob
38 44

  
39 45
  # Overrides ActionMailer::Base#process in order to set the recipient as the current user
......
641 647
    end
642 648
  end
643 649

  
644
  # Activates/desactivates email deliveries during +block+
650
  # Activates/desactivates email deliveries during +block+, in the current
651
  # thread only
645 652
  def self.with_deliveries(enabled = true, &)
646
    was_enabled = ActionMailer::Base.perform_deliveries
647
    ActionMailer::Base.perform_deliveries = !!enabled
648
    yield
649
  ensure
650
    ActionMailer::Base.perform_deliveries = was_enabled
653
    CurrentDeliveries.set(disabled: !enabled, &)
654
  end
655

  
656
  def self.perform_deliveries?
657
    ActionMailer::Base.perform_deliveries && !CurrentDeliveries.disabled
651 658
  end
652 659

  
653 660
  # Execute the given block with inline sending of emails if the default Async
......
736 743
  end
737 744

  
738 745
  def self.deliver_mail(mail)
746
    return false unless perform_deliveries?
739 747
    return false if mail.to.blank? && mail.cc.blank? && mail.bcc.blank?
740 748

  
741 749
    begin
test/unit/mailer_test.rb
1103 1103
    assert ActionMailer::Base.perform_deliveries
1104 1104
  end
1105 1105

  
1106
  def test_with_deliveries_off_should_not_enqueue_delivery_jobs
1107
    previous_adapter = ActionMailer::MailDeliveryJob.queue_adapter
1108
    ActionMailer::MailDeliveryJob.queue_adapter = :test
1109
    Mailer.with_deliveries false do
1110
      Mailer.test_email(User.find(1)).deliver_later
1111
    end
1112
    assert_empty ActionMailer::MailDeliveryJob.queue_adapter.enqueued_jobs
1113
    assert ActionMailer::Base.deliveries.empty?
1114
  ensure
1115
    ActionMailer::MailDeliveryJob.queue_adapter = previous_adapter
1116
  end
1117

  
1118
  def test_with_deliveries_off_should_not_disable_deliveries_in_other_threads
1119
    Mailer.with_deliveries false do
1120
      Thread.new { Mailer.test_email(User.find(1)).deliver_now }.join
1121
    end
1122
    assert_equal 1, ActionMailer::Base.deliveries.size
1123
  end
1124

  
1106 1125
  def test_token_for_should_strip_trailing_gt_from_address_with_full_name
1107 1126
    with_settings :mail_from => "Redmine Mailer<no-reply@redmine.org>" do
1108 1127
      assert_match /\Aredmine.issue-\d+\.\d+\.3@redmine.org\z/,
(3-3/3)