2010-09-17 11 views

Odpowiedz

12

Alternatywnie, zamiast używania opóźnionego :: Mailer gem, można łatwo wdrożyć i wykorzystywać własne ActionMailer "Sposób dostawy", który ...

  1. przechwytuje dostarczania poczty od ActionMailer
  2. przechowuje wiadomości e-mail w tabeli (opcjonalnie)
  3. tworzy Opóźniony :: Praca, która odwołuje się przechowywanymi e-
  4. dostarcza zapisany email, gdy praca jest wykonywana z opóźnieniem

Czy coś wzdłuż linii:

# in config/application.rb 
ActionMailer::Base.add_delivery_method :queued, Mail::QueuedDelivery 

# in config/environment.rb (or one of the config/environments/*.rb files) 
config.action_mailer.delivery_method = :queued # ie. Mail::QueuedDelivery 

# in lib/mail/queued_delivery.rb 
module Mail 
    class QueuedDelivery 

    def initialize(values = {}) 
     # (optional) 
    end 

    def deliver!(mail) 
     email = Email.create!(:delivery_handler => mail.delivery_handler.name, :message => mail.to_s) 
     Delayed::Job.enqueue Jobs::Email::DeliverEmail.new(email.id) 
    end 

    end # class QueueDelivery 
end # module Mail 

Opóźnione :: Praca trzeba realizować będzie potem ...

  1. odzyskać przechowywanych e-mail z bazy danych - email = ::Email.find_by_id(email_id)
  2. dostarczyć e-mail za pośrednictwem poczty gem - Mail::Message.new(email.message).deliver

to jest to ... mam nadzieję, że to pomoże!

3

Nie mam pojęcia, czym jest Devise, ale sądzę, że jest to klejnot innej firmy, którego nie chcesz modyfikować. Wypróbuj delayed_job_mailer. Możesz rozszerzyć program pocztowy Devise o małpkę, która łata je w celu użycia delayed_job.

class SomeExistingMailer 
    include Delayed::Mailer 
end 

lub jeśli chcesz wysłać wszystkie e-maile za pośrednictwem aplikacji opóźnionej pracy domyślnie:

# config/initializers/delayed_mailer.rb 
class ActionMailer::Base 
    include Delayed::Mailer 
end 
+1

Czy to działa? Szukam tego samego rozwiązania – AnApprentice

+0

Wypróbowałem twoją drugą sugestię, która byłaby niesamowita, gdyby zadziałała, ale dostał błąd "/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: uninitialized constant Delayed: : Mailer (NameError) " – AnApprentice

+0

Wydaje mi się, że klej Delayed mailer nie został załadowany. Czy określono go w Gemfile, ostatecznie wymagają go w environment.rb – gertas

2

Okazało się, że żaden z powyższych nie zadziałał u mnie. Używam Devise 2.0.4 i Rails 3.2.2 z delayed_job_active_record 0.3.2

Sposób, w jaki program de facto mówi o zrobieniu czegoś takiego w komentarzach w kodzie, ma na celu zastąpienie metod w klasie User. Tak więc, jak mam rozwiązać go tak, i to działa doskonale:

app/models/User.rb

def send_on_create_confirmation_instructions 
    Devise::Mailer.delay.confirmation_instructions(self) 
end 
def send_reset_password_instructions 
    Devise::Mailer.delay.reset_password_instructions(self) 
end 
def send_unlock_instructions 
    Devise::Mailer.delay.unlock_instructions(self) 
end 
Powiązane problemy