Aggiunge fascia oraria, prova manuale obbligatoria e cruscotto invii email.
Le campagne rispettano orario e giorni lavorativi, richiedono una mail di test con dati inseriti a mano prima dell'invio massivo e offrono una dashboard per monitorare l'avanzamento. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
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
|
||||
end
|
||||
end
|
||||
@@ -9,6 +9,18 @@ class SendMailingRecipientJob < ApplicationJob
|
||||
return unless mailing.sending?
|
||||
return unless recipient.pending? || recipient.status == "queued"
|
||||
|
||||
clock = Mailings::SendClock.new(mailing)
|
||||
unless clock.open?
|
||||
mailing.enqueue_next_recipient!(recipient, from: clock.next_open_at)
|
||||
return
|
||||
end
|
||||
|
||||
if mailing.next_send_at.present? && mailing.next_send_at > Time.current
|
||||
wait = mailing.next_send_at - Time.current
|
||||
self.class.set(wait: wait).perform_later(recipient.id) if wait <= 2.minutes
|
||||
return
|
||||
end
|
||||
|
||||
begin
|
||||
CampaignMailer.raise_delivery_errors = true
|
||||
recipient.deliver!
|
||||
@@ -17,13 +29,6 @@ class SendMailingRecipientJob < ApplicationJob
|
||||
end
|
||||
|
||||
nxt = mailing.mailing_recipients.pending.order(:id).first
|
||||
return if nxt.nil?
|
||||
|
||||
wait = mailing.interval_seconds.to_i.seconds
|
||||
if wait.positive?
|
||||
self.class.set(wait: wait).perform_later(nxt.id)
|
||||
else
|
||||
self.class.perform_later(nxt.id)
|
||||
end
|
||||
mailing.enqueue_next_recipient!(nxt, from: Time.current + mailing.interval_seconds.seconds)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user