2011-01-31 16 views
33

Me gustaría ejecutar algún código siempre que se envíe un correo electrónico en mi aplicación.Cómo creo un Mailer Observer

Como ActionMailer no es compatible con after_filter, me gustaría utilizar un observador.

Los rieles lo mencionan de paso, sin embargo, no da más detalles.

Gracias!

Respuesta

71

Me sorprende lo poco que hay en la documentación de Rails sobre esto.

Básicamente, ActionMailer in Rails 3 introduce el uso de interceptores (llamados antes de enviar el mensaje) y observadores (después de enviar el mensaje).

Para configurar un observador, añada lo siguiente a un inicializador:

class MailObserver 
    def self.delivered_email(message) 
    # Do whatever you want with the message in here 
    end 
end 

ActionMailer::Base.register_observer(MailObserver) 

Ahora, el método delivered_email se ejecutará cada vez que la aplicación envía un correo electrónico. Sin embargo, solo tendrá acceso al mensaje real Mail.

Para registrar un interceptor en su lugar, hacer lo mismo que anteriormente, la sustitución de register_observer con register_interceptor, y cambiar el nombre del método self.delivered_email-self.delivering_email.

This Railscast fue la mejor fuente que pude encontrar para obtener información sobre esto (solo hablan de interceptores, pero el concepto es el mismo para los observadores).

+1

Gracias dmarkow, esto es exactamente lo que estaba buscando, y como dijiste, la información es escasa, especialmente cuando no sabes que el término "Interceptores" es uno que debes buscar. – thomasfedb

+14

Esto genera algunas preguntas más: (1) ¿Cómo podría decir a qué correo y qué método se utilizó, (2) ¿Cómo observaría la falla y (3) ¿Cómo lo probaría, incluido el caso de falla? – user1158559

+1

Puedo confirmar que esto también funciona en Rails 4 –

Cuestiones relacionadas