2010-09-17 1 views

ответ

12

В качестве альтернативы, вместо использования отложенной :: Mailer камень, вы можете довольно легко реализовать и использовать свои собственные ActionMailer «способ доставки», который ...

  1. перехватывает доставки почты из ActionMailer
  2. хранит электронную почту в таблице (опционально)
  3. создает Delayed :: Работа, которая ссылается на хранимую Отправить по электронной почте
  4. доставляет хранимую письмо, когда задержанный работа выполняется

ли что-то вдоль линий:

# 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 

запаздывающего :: Работа вам нужно будет затем реализовать ...

  1. получить накопленную электронную почту из базы данных - email = ::Email.find_by_id(email_id)
  2. доставить электронную почту через почтовую жемчужину - Mail::Message.new(email.message).deliver

Вот это ... надеюсь, что это поможет!

3

Я понятия не имею, что такое Devise, но я думаю, что это сторонний драгоценный камень, который вы не хотите изменять. Код: delayed_job_mailer. Вы можете расширять рассылку разработчиков, обезьянными патчами, чтобы использовать delayed_job.

class SomeExistingMailer 
    include Delayed::Mailer 
end 

или если вы хотите, чтобы отправить все сообщения электронной почты приложения с помощью замедленной работы по умолчанию:

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

Завершилось ли это? Я ищу то же самое решение – AnApprentice

+0

Я попробовал ваше второе предложение, которое было бы удивительно, если бы оно сработало, но получило сообщение об ошибке «/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: uninitialized constant Delayed: : Mailer (NameError) " – AnApprentice

+0

Мне кажется, что почтовая почта Delayed не была загружена. Вы указали его в Gemfile, в конечном итоге потребовали его в environment.rb – gertas

2

Я обнаружил, что ничто из этого не работает для меня. Я использую Devise 2.0.4 и Rails 3.2.2 с delayed_job_active_record. 0.3.2

Способ, которым на самом деле говорит о том, как что-то подобное делать в комментариях в коде, заключается в переопределении методов в классе User. Таким образом, я решил это, как это так, и это работает прекрасно:

приложения/модель/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 
Смежные вопросы