Có cách nào đơn giản để nói với Devise gửi tất cả email qua delay_job không?Gửi email bị trì hoãn từ việc phát minh
Trả lời
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 đó ...
- chặn chuyển phát thư từ ActionMailer
- lưu trữ các email trong một bảng (không bắt buộc)
- tạo ra một Chậm :: Job tham chiếu đến các email được lưu trữ
- 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 đó ...
- lấy email được lưu trữ từ cơ sở dữ liệu -
email = ::Email.find_by_id(email_id)
- 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 đỡ!
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
Đ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
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
Đ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
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
Hiện nay là dự án devise-async mà đạt được chính xác này:
http://stackoverflow.com/questions/4125564/rails-devise-delay ed-job – Zabba