2010-09-17 66 views

回答

12

或者,而是採用了延遲::梅勒的寶石,你可以很輕鬆地實現和使用自己的的ActionMailer「分配方法」,一說......

  1. 攔截郵件傳遞從的ActionMailer
  2. 存儲電子郵件的表(可選)
  3. 創建一個延遲::作業引用存儲的電子郵件
  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 

您需要執行的Delayed :: Job然後...

  1. 從數據庫中檢索存儲的電子郵件 - email = ::Email.find_by_id(email_id)
  2. 通過郵件寶石交付電子郵件 - Mail::Message.new(email.message).deliver

就是這樣......希望這幫助!

3

我不知道Devise是什麼,但我想它是你不想修改的第三方gem。 嘗試delayed_job_mailer。您可以通過將它們修補以使用delayed_job來擴展Devise郵件程序。

class SomeExistingMailer 
    include Delayed::Mailer 
end 

,或者如果你想通過延遲工作在默認情況下將所有的應用程序的電子郵件:

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

這是否最終工作?我正在尋找相同的解決方案 – AnApprentice 2010-11-08 16:51:21

+0

我試過你的第二個建議,如果它能夠工作,那將是驚人的,但遇到錯誤「/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3:未初始化的常量Delayed: :梅勒(NameError)「 – AnApprentice 2010-11-08 16:52:22

+0

在我看來,這延遲郵件寶石沒有加載。你有沒有在Gemfile中指定它,最終在environment.rb中需要它 – gertas 2010-11-09 09:56:16

2

我發現以上都不適合我。我正在使用Devise 2.0.4和Rails 3.2.2 with delayed_job_active_record 0.3.2

devise實際上談論在代碼的註釋中做這樣的事情的方式是覆蓋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