2010-09-17 12 views

Trả lời

12

Ngoài ra, thay vì sử dụng Chậm :: Mailer đá quý, bạn có thể khá dễ dàng thực hiện và sử dụng của riêng bạn ActionMailer "phương pháp phân phối", một trong những điều đó ...

  1. chặn chuyển phát thư từ ActionMailer
  2. lưu trữ các email trong một bảng (không bắt buộc)
  3. tạo ra một Chậm :: Job tham chiếu đến các email được lưu trữ
  4. cung cấp các email được lưu trữ khi công việc trì hoãn được thực hiện

làm cái gì đó dọc theo dòng:

# 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 

Trì hoãn :: Công việc bạn cần thực hiện sau đó ...

  1. lấy email được lưu trữ từ cơ sở dữ liệu - email = ::Email.find_by_id(email_id)
  2. cung cấp những email qua viên ngọc mail - Mail::Message.new(email.message).deliver

Đó là nó ... hy vọng điều này giúp đỡ!

3

Tôi không biết Devise là gì nhưng tôi đoán đó là đá quý của bên thứ ba mà bạn không muốn sửa đổi. Hãy thử delayed_job_mailer. Bạn có thể mở rộng Devise gửi thư bằng cách khỉ vá chúng để sử dụng delay_job.

class SomeExistingMailer 
    include Delayed::Mailer 
end 

hoặc nếu bạn muốn gửi tất cả các email ứng dụng thông qua việc trì hoãn theo mặc định:

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

Điều này có hiệu quả không? Tôi đang tìm các giải pháp tương tự – AnApprentice

+0

Tôi đã thử đề xuất thứ 2 của bạn sẽ là tuyệt vời nếu nó làm việc, nhưng có một lỗi "/Users/bhellman/Sites/cline/config/initializers/delayed_mailer.rb:3: uninitialized hằng số Trì hoãn: : Mailer (NameError) " – AnApprentice

+0

Điều này dường như với tôi rằng gemer gửi thư bị trễ không được tải. Bạn đã xác định nó trong Gemfile, cuối cùng yêu cầu nó trong environment.rb – gertas

2

Tôi thấy rằng không có điều nào ở trên phù hợp với tôi. Tôi đang sử dụng Devise 2.0.4 và Rails 3.2.2 với delay_job_active_record 0.3.2

Cách thức thực sự nói về việc làm một cái gì đó như thế này trong các chú thích trong mã là ghi đè lên các phương thức trong lớp Người dùng. Vì vậy, tôi giải quyết nó như vậy, và nó hoạt động hoàn hảo:

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