Sto utilizzando un callback after_action
nei miei mailer per registrare che l'email è stata inviata. Le e-mail vengono inviate attraverso il lavoro differito. Funziona, tranne quando non siamo in grado di raggiungere il server remoto - nel qual caso, l'e-mail non viene inviata, ma registriamo che lo era. Il lavoro ritardato ripete l'e-mail in un secondo momento e viene consegnato correttamente, ma abbiamo registrato che sono state inviate due e-mail.Rileva errori di consegna del mailer di azione in callback after_action
Sembra qualcosa di simile a questo:
class UserMailer < ActionMailer::Base
after_action :record_email
def record_email
Rails.logger.info("XYZZY: Recording Email")
@user.emails.create!
end
def spam!(user)
@user = user
Rails.logger.info("XYZZY: Sending spam!")
m = mail(to: user.email, subject: 'SPAM!')
Rails.logger.info("XYZZY: mail method finished")
m
end
end
Io chiamo questo codice come questo (usando delayed job performable mailer):
UserMailer.delay.spam!(User.find(1))
Quando faccio un passo attraverso questo in un debugger, sembra che il mio metodo after_action si chiama prima che la posta sia consegnata
[Job:104580969] XYZZY: Sending spam!
[Job:104580969] XYZZY: mail method finished
[Job:104580969] XYZZY: Recording Email
Job UserMailer.app_registration_welcome (id=104580969) FAILED (3 prior attempts) with Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 1025
Come posso rilevare errori di rete nel mio metodi di mailing e registrare che il tentativo di e-mail non è riuscito, o non fare nulla? Sto usando Rails 4.2.4.
che non funziona. Ha un po 'di come il ritardo del processo elabora l'e-mail. Chiama il tuo metodo mailer quindi invoca il recapito (o deliver_now) su di esso. Quindi la consegna effettiva viene eseguita al di fuori dello spam! metodo –
Voglio anche qualcosa che funzioni senza dover ricordare di implementarlo su tutti i metodi mailer o chagne tutti i miei metodi mailer esistenti (ce ne sono circa 30) –