7

すべてのメールをdelayed_job経由で送信するようDeviseに指示する簡単な方法はありますか?

4

4 に答える 4

12

または、Delayed::Mailer gem を使用する代わりに、独自の ActionMailer の「配信方法」を非常に簡単に実装して使用することができます。

  1. ActionMailer からのメール配信を傍受します
  2. 電子メールをテーブルに保存します(オプション)
  3. 保存された電子メールを参照する Delayed::Job を作成します
  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 gem を介してメールを配信する --Mail::Message.new(email.message).deliver

それだけです...この助けを願っています!

于 2010-11-30T17:22:39.443 に答える
3

Devise が何であるかはわかりませんが、変更したくないサードパーティの gem だと思います。delay_job_mailerを試してください。Delayed_job を使用するようにモンキー パッチを適用することで、Devise メーラーを拡張できます。

class SomeExistingMailer
  include Delayed::Mailer
end

または、デフォルトで遅延ジョブを介してすべてのアプリ メールを送信する場合:

# config/initializers/delayed_mailer.rb
class ActionMailer::Base
  include Delayed::Mailer
end
于 2010-09-18T16:10:44.460 に答える
2

上記のどれもうまくいかないことがわかりました。私はDevise 2.0.4とRails 3.2.2を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
于 2012-03-14T22:23:18.423 に答える
0

これを正確に実現する devise-async プロジェクトがあります。

于 2013-11-20T01:44:19.663 に答える