Techioz Blog

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