2011-08-27 9 views
6

Dada una instancia de Mailer en Rails 3, ¿hay alguna manera de anular el delivery_method en él?¿Utiliza un método de entrega diferente con ActionMailer solo para un solo correo electrónico?

Quiero enviar ciertos correos electrónicos a través de un transporte de alta prioridad, y otros usan un método más concurrido y de baja prioridad.

Puedo ajustar la configuración en el tiempo de ejecución y volver a cambiarla, pero está plagada de posibles efectos secundarios.

+0

¿Está utilizando un trabajo retrasado o cualquier otro sistema de búsqueda? En caso afirmativo, es muy probable que los esté usando para encascar todos sus correos electrónicos. Puede configurar un EMAIL_ENV (cada uno con diferentes configuraciones de ActionMailer), similar a RAILS_ENV e iniciar diferentes trabajadores con diferentes EMAIL_ENV. En caso de que algún correo se entregue directamente a través de la aplicación, puede tener un valor predeterminado sensato para EMAIL_ENV. – rubish

+1

En realidad, eso es exactamente lo que estoy haciendo. No describí mi problema como realmente existe :) Estoy enviando correos a través de mi propio método de entrega ': en cola' (en Resque, que hace un seguimiento adicional) y luego de Resque tengo que enviarlos a través de SMTP . Resulta que configurar 'método_entrega (método de clase) dentro de una subclase de' ActionMailer :: Base' no tiene realmente un impacto global y hace lo que necesito :) Enviamos otros correos electrónicos a través de nuestra cola Resque, así que no lo hice quiero cambiar todo ese entorno (sé que podría configurar diferentes trabajadores de manera diferente). – d11wtq

+0

Es bueno saber que algo así existe y no tiene un impacto global. – rubish

Respuesta

6

Resulta que esto afecta solo a esta aplicación de correo específica, sin cambiar ActionMailer::Base en todo el mundo.

class SomeMailer < ActionMailer::Base 
    self.delivery_method = :high_priority 

    def some_email(params) 
    end 
end 

También puede hacer esto (advertencia: afectará a todas las instancias de AnotherMailer), si tiene la instancia por adelantado:

mail = AnotherMailer.whatever_email 
mail.delivery_handler.delivery_method = :something_else 

Estos no parecen ser documentado, pero el trabajo .

+0

¿Puede elaborar un poco el ': high_priority' o señalarme hacia el recurso. Acabo de implementar el enfoque EMAIL_ENV, pero aún no lo he llevado a producción. Estoy tendiendo a probar la solución más simple. :) – rubish

+0

Lo anterior simplemente asume que ha escrito su propio método de entrega y lo ha agregado al mailer de acción con 'ActionMailer :: Base.add_delivery_method: high_priority, YourHighPrioritySender' (que simplemente implementa' deliver! '). Podría reemplazar ': high_priority' con': smtp' si está utilizando un método de entrega listo para usar. – d11wtq

+0

Voy a publicar un artículo (tendrá que dejarlo un poco flojo, ya que es trabajo). – d11wtq

0

Solía ​​hacer eso en una aplicación de Rails 2 donde algunos correos electrónicos se enviaban a través de ActionMailer y otros se enviaban a través de ArMailer. No es una mala solución siempre que no cambie el método de entrega en la misma entrega porque podría causar que el método de entrega no se cambie en caso de error con la entrega, esto es lo que hice:

class Mailer1 

    def my_mail1 
    config 
    end 

private 

    def config 
    ActionMailer::Base.delivery_method = :smtp 
    end 

end 


class Mailer2 

    def my_mail2 
    config 
    end 

private 

    def config 
    ActionMailer::Base.delivery_method = :sendmail 
    end 

end 
+0

Cambiando ActionMailer :: base como que tiene un impacto global y puede dar lugar a condiciones de carrera, creo. – d11wtq

Cuestiones relacionadas