Ich verwende einen Rückruf after_action
in meine Mailer, um aufzuzeichnen, dass E-Mail gesendet wurde. Die E-Mails werden über einen verzögerten Job gesendet. Dies funktioniert, außer wenn wir den Remote-Server nicht erreichen können. In diesem Fall wird die E-Mail nicht gesendet, aber wir registrieren, dass dies der Fall war. Verzögerter Job wiederholt die E-Mail später und wird erfolgreich zugestellt, aber wir haben dann aufgezeichnet, dass zwei E-Mails gesendet wurden.Erkennen von Aktion Mailer Delivery-Fehler in AfterAction-Callbacks
Es sieht ungefähr so aus:
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
ich diesen Code wie folgt aufrufen (mit delayed job performable mailer):
UserMailer.delay.spam!(User.find(1))
Wenn ich durch diese in einem Debugger Schritt, wie es scheint, dass meine after_action Methode aufgerufen wird bevor die Mail zugestellt wird
[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
Wie kann ich Netzwerkfehler in meinem Mailer-Methoden und notieren, dass der E-Mail-Versuch fehlgeschlagen ist, oder gar nichts tun? Ich benutze Rails 4.2.4.
das nicht funktioniert haben zu schicken. Es hat ein bisschen mit wie verzögerter Job verarbeitet die E-Mail. Er ruft Ihre Mailer-Methode auf und ruft dann die Zustellung (oder deliver_now) darauf auf. Die eigentliche Zustellung erfolgt also außerhalb des Spams! Methode –
Ich möchte auch etwas, das funktioniert, ohne daran zu erinnern, es bei jeder Mailer-Methode zu implementieren oder chagne alle meine bestehenden Mailer-Methoden (es gibt etwa 30) –