Sending delayed email from devise

后端 未结 4 1889
长情又很酷
长情又很酷 2021-02-03 13:43

Is there a simple way of telling Devise to send all email via delayed_job?

4条回答
  •  悲&欢浪女
    2021-02-03 14:28

    Alternatively, instead of using the Delayed::Mailer gem, you can quite easily implement and use your own ActionMailer "delivery method", one that...

    1. intercepts mail delivery from ActionMailer
    2. stores the email in a table (optional)
    3. creates a Delayed::Job that references the stored email
    4. delivers the stored email when the delayed job is executed

    Do something along the lines of:

    # 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
    

    The Delayed::Job you need to implement would then...

    1. retrieve the stored email from the database -- email = ::Email.find_by_id(email_id)
    2. deliver the email via the mail gem -- Mail::Message.new(email.message).deliver

    That's it... hope this help!

提交回复
热议问题