Serializza gli invii SMTP su una coda unica per non far chiudere Aruba.
CI / scan_js (push) Has been cancelled
CI / scan_ruby (push) Has been cancelled
CI / lint (push) Has been cancelled

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-07 12:06:23 +02:00
co-authored by Cursor
parent a9470d7e77
commit 403fe80d37
12 changed files with 423 additions and 29 deletions
+16
View File
@@ -0,0 +1,16 @@
class DrainOutboundJob < ApplicationJob
queue_as :mailers
def perform
result = Mailings::OutboundQueue.drain_one!
return unless result.in?(%i[sent deferred wait])
return unless Mailings::OutboundQueue.queued_scope.exists?
wait = Mailings::OutboundQueue.seconds_until_next_slot
wait = 0 if wait.blank? || wait.negative?
max_wait = [ Mailings::OutboundQueue.min_interval.to_f, 2.minutes ].max + 5.seconds
return if wait > max_wait
self.class.set(wait: wait).perform_later
end
end
+1 -13
View File
@@ -1,28 +1,16 @@
class ResumeMailingsJob < ApplicationJob
queue_as :mailers
STALE_QUEUED_AFTER = 10.minutes
def perform
recover_stale_queued!
Mailing.sending.due_to_send.find_each do |mailing|
next unless Mailings::SendClock.new(mailing).open?
next if mailing.mailing_recipients.queued.exists?
recipient = mailing.mailing_recipients.pending.order(:id).first
next unless recipient
SendMailingRecipientJob.perform_later(recipient.id)
end
end
private
def recover_stale_queued!
MailingRecipient.queued.where("updated_at < ?", STALE_QUEUED_AFTER.ago).find_each do |recipient|
next unless recipient.mailing.sending?
recipient.update!(status: "pending", error_message: nil)
end
DrainOutboundJob.perform_later if Mailings::OutboundQueue.queued_scope.exists?
end
end
+4 -7
View File
@@ -21,14 +21,11 @@ class SendMailingRecipientJob < ApplicationJob
return
end
begin
CampaignMailer.raise_delivery_errors = true
recipient.deliver!
ensure
CampaignMailer.raise_delivery_errors = false if Rails.env.development?
if recipient.pending? && Mailings::OutboundQueue.enqueue(recipient)
nxt = mailing.mailing_recipients.pending.order(:id).first
mailing.enqueue_next_recipient!(nxt, from: Time.current + mailing.interval_seconds.seconds)
end
nxt = mailing.mailing_recipients.pending.order(:id).first
mailing.enqueue_next_recipient!(nxt, from: Time.current + mailing.interval_seconds.seconds)
DrainOutboundJob.perform_later
end
end