2011-08-27 4 views
6

Biorąc pod uwagę instancję Mailer w Railsach 3, czy istnieje sposób na przesłonięcie na niej delivery_method?Użyj innej metody delivery_method z ActionMailer tylko dla pojedynczego adresu e-mail?

Chcę przesłać niektóre wiadomości e-mail za pośrednictwem transportu o wysokim priorytecie, a inne za pomocą bardziej obciążonej metody o niskim priorytecie.

Mogę dostosować konfigurację w czasie wykonywania i zmienić ją z powrotem, ale jest to obarczona potencjalnymi efektami ubocznymi.

+0

Czy korzystasz z opóźnionego zlecenia lub innego systemu queing? Jeśli tak, najprawdopodobniej używasz ich do zakotwiczenia wszystkich twoich e-maili. Możesz ustawić EMAIL_ENV (każdy ma inną konfigurację ActionMailer), podobny do RAILS_ENV i uruchomić różnych pracowników o różnych adresach EMAIL_ENV. Jeśli niektóre wiadomości są dostarczane bezpośrednio za pośrednictwem aplikacji, możesz mieć domyślną wartość domyślną dla adresu EMAIL_ENV. – rubish

+1

Właściwie to właśnie robię. Nie opisałem mojego problemu, ponieważ on faktycznie istnieje :) Wysyłam maile za pomocą mojej własnej metody '': queued' (do Resque, która wykonuje dodatkowe śledzenie), a następnie z Resque'a Muszę wysłać je przez SMTP . Okazuje się, że ustawienie 'delivery_method' (metoda klasy) z podklasy' ActionMailer :: Base' nie ma globalnego wpływu i robi to, czego potrzebuję :) Wysyłamy inne e-maile za pośrednictwem naszej kolejki Resque, więc nie zrobiłem tego chcę zmienić całe środowisko (wiem, że mogłem inaczej skonfigurować różnych pracowników). – d11wtq

+0

Dobrze wiedzieć, że coś takiego istnieje i nie ma globalnego wpływu. – rubish

Odpowiedz

6

Okazuje się, że robi to dotyczy tylko tego konkretnego programu Mailer, nie zmieniając globalnie ActionMailer::Base.

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

    def some_email(params) 
    end 
end 

Można również zrobić to (Uwaga: będzie dotyczyć wszystkich wystąpień AnotherMailer), jeśli instancja w górę przód:

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

te nie wydają się być udokumentowane, ale praca .

+0

Czy możesz rozwinąć trochę ': high_priority' lub skierować mnie w stronę zasobu. Właśnie zaimplementowałem podejście EMAIL_ENV, ale nie popchnęłem go jeszcze do produkcji. Mam tendencję do wypróbowania prostszego rozwiązania. :) – rubish

+0

Powyższe założenie zakłada, że ​​napisałeś własną metodę dostarczania i dodałeś ją do akcji mailer z 'ActionMailer :: Base.add_delivery_method: high_priority, YourHighPrioritySender' (który po prostu implementuje' dostarcz! '). Możesz zamienić ': high_priority' na': smtp', jeśli używasz gotowej metody dostarczania. – d11wtq

+0

Porzucę sedno (będę musiał go trochę przygłuszyć, ponieważ jest to praca). – d11wtq

0

Zwykłem to robić w aplikacji Rails 2, w której niektóre wiadomości e-mail były wysyłane za pośrednictwem ActionMailer, a inne były wysyłane za pośrednictwem ArMailer. To nie jest złe rozwiązanie, o ile nie zmienisz metody dostawy z powrotem w tej samej dostawie, ponieważ może to spowodować, że metoda dostawy nie zostanie zmieniona w przypadku błędu z dostawą, oto, co zrobiłem:

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

Zmiana ActionMailer'a :: Baza ma globalny wpływ i może powodować warunki wyścigowe, jak sądzę. – d11wtq

Powiązane problemy