在Ruby on Rails上发送电子邮件

hvvq6cgz  于 2024-01-07  发布在  Ruby
关注(0)|答案(1)|浏览(153)

我创建了一个邮件程序来发送电子邮件给我的客户。截至目前,我仍在测试它,但我无法使它工作。我已经阅读了Redis,Sidekiq,rails_mailer,仍然没有。我可以看到邮件在Sidekiq UI的队列中,但我无法接收电子邮件。
下面是我的代码流程。
1.如果用户想要向客户端发送电子邮件,则将选中视图上的文本框。
1.一个方法将在控制器上被触发。这是我的代码。

def send_workorder_message
        if params.has_key?(:to_send_email)
          WorkorderMessage::WorkorderMessageJob.perform_in(10.seconds, @curr_user, params[:message])
        end
      endv

字符串
1.然后创建一个工作单作业。下面是代码。

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


1.然后它将触发WorkorderMailer;代码如下:

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


当我使用预览邮件,我可以看到用户界面工作正常。
我还注意到在sidekiq视图中我看到这个User对象。这正常吗?
x1c 0d1x的数据

tpgth1q7

tpgth1q71#

根据the Sidekiq documentation,你传递的参数必须是干净地序列化为JSON的原语,而不是完整的Ruby对象,比如你在这里传递的user
复杂的Ruby对象不会转换为JSON,默认情况下,它会转换为to_s,看起来像#<Quote:0x0000000006e57288>。即使它们正确序列化了,如果队列备份,而引号对象在此期间发生了变化,会发生什么?不要将状态保存到Sidekiq,保存简单的标识符。在perform方法中真正需要对象时查找它们。传递给perform_jsoc必须由简单的JSON数据库组成:string,integer,float,boolean,null(nil),数组和哈希。这意味着你不能使用ruby符号作为参数。Sidekiq客户端API使用JSON.dump将数据发送到Redis。Sidekiq服务器从Redis提取JSON数据,并使用JSON.load将数据转换回Ruby类型以传递给不要传递符号、命名参数或复杂的Ruby对象(如Date或Time!),因为它们在转储/加载的往返过程中无法正常运行。
我建议您将其更改为在作业中通过ID查找User,并且只传递ID而不是整个user对象。

# 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

字符串

相关问题