Ruby on Rails のジョブとして電子メールを送信する
概要
クライアントにメールを送信するためのメーラーを作成しました。現時点ではまだテスト中ですが、動作させることができませんでした。 Redis、Sidekiq、rails_mailerを読みましたが、まだ何も読みません。 Sidekiq UI のキューにメールが入っているのはわかりますが、メールを受信できません。
これが私のコードの流れです。
def send_workorder_message
if params.has_key?(:to_send_email)
WorkorderMessage::WorkorderMessageJob.perform_in(10.seconds, @curr_user, params[:message])
end
endv
class WorkorderMessage::WorkorderMessageJob
# include SuckerPunch::Job
include Sidekiq::Worker
sidekiq_options queue: 'mailers'
def perform(user, message)
Spree::WorkorderMailer.workorder_send_to_email(user, message).deliver_now
# ActiveRecord::Base.connection_pool.with_connection do
# end
end
end
class WorkorderMailer < BaseMailer
def workorder_send_to_email(to_user, message)
ActiveRecord::Base.connection_pool.with_connection do
subject = "sample message mailer"
@message = message
@user = to_user
mail(
to: @user.email,
# 'reply-to': Spree::Store.current.support_address,
from: Spree::Store.current.support_address,
subject: subject
)
end
end
end
プレビュー メーラーを使用すると、UI が正常に動作していることがわかります。
また、sidekiq ビューにこの User Obj が表示されていることにも気付きました。それは普通ですか?
解決策
Sidekiq のドキュメントによると、渡す引数は、ここで渡しているユーザーのような完全な Ruby オブジェクトではなく、JSON にクリーンにシリアル化されるプリミティブである必要があります。
ジョブ内で ID でユーザーを検索し、ユーザー オブジェクト全体ではなく ID のみを渡すように変更することをお勧めします。
# pass @curr_user.id instead of @curr_user
WorkorderMessage::WorkorderMessageJob.perform_in(10.seconds, @curr_user.id, params[:message])
# accept the ID instead of user here
def perform(user_id, message)
# get the user object here
user = User.find(user_id)
# send the mail
mail(
to: user.email,
#...
end