【问题标题】:How can I get Sidekiq to work with Mailboxer message emails?如何让 Sidekiq 使用 Mailboxer 消息电子邮件?
【发布时间】:2014-06-23 23:15:41
【问题描述】:

我在 Rails 4.1 上尝试使用 Mailboxer Gem 和 Sidekiq,我按照文档中的文档和示例应用程序进行了所有设置。然后我将邮件程序配置为在 initializers/mailboxer.rb 中使用 UserMailer:

config.notification_mailer = UserMailer
config.message_mailer = UserMailer

无论是在网站上还是在发送或回复消息时接收电子邮件,一切都按预期工作。接下来,我尝试使用从one of the issues on the Mailboxer github page 获得的这段代码,使用 Sidekiq 异步完成邮件作业。这也在初始化程序中:

config.custom_deliver_proc = ->(mailer, mailable, recipient) do
  mailer.delay.send_email(mailable, recipient)
end

但是,现在当我发送消息时,它会点击 Sidekiq,但会引发此错误:

ArgumentError: undefined class/module Mailboxer::Message

这是user_mailer.rb中的相关代码:

def send_email(message, receiver)
  if message.conversation.messages.size > 1
    reply_message_email(message,receiver)
  else
    new_message_email(message,receiver)
  end
end

#Sends an email for indicating a new message for the receiver
def new_message_email(message,receiver)
  @message  = message
  @receiver = receiver
  set_subject(message)
  mail :to => receiver.send(Mailboxer.email_method, message),
     :subject => t('mailboxer.message_mailer.subject_new', :subject => @subject),
     :template_name => 'new_message_email'
end

#Sends and email for indicating a reply in an already created conversation
def reply_message_email(message,receiver)
  @message  = message
  @receiver = receiver
  set_subject(message)
  mail :to => receiver.send(Mailboxer.email_method, message),
     :subject => t('mailboxer.message_mailer.subject_reply', :subject => @subject),
     :template_name => 'reply_message_email'
end

我目前没有使用通知,所以我没有包含它。它在哪里调用 Mailboxer::Message,它期望什么参数?这是 Rails 4.1 的事情吗?我对 Ruby/Rails 还是很陌生,如果这是我的明显错误,我很抱歉。

我还尝试在 UserMailer 中的各个方法上调用 delay,结果相同:

def send_email(message, receiver)
  if message.conversation.messages.size > 1
    UserMailer.delay.reply_message_email(message,receiver)
  else
    UserMailer.delay.new_message_email(message,receiver)
  end
end

【问题讨论】:

    标签: ruby-on-rails sidekiq ruby-on-rails-4.1 mailboxer


    【解决方案1】:

    这对我没有用。 mailer 没有 delay 方法。看这里:

    >> RUBY_VERSION
    => "2.2.0"
    >> Rails::VERSION::STRING
    => "4.2.1"
    
    >> mailer.methods.include?(:delay)
    => false
    >> mailer.send_email(mailable, recipient).methods.include?(:deliver_later)
    => true
    

    所以,如果您使用 Rails > 4.2,请使用:

    config.custom_deliver_proc = ->(mailer, mailable, recipient) do
      mailer.send_email(mailable, recipient).deliver_later
    end
    

    【讨论】:

    • 确认这也是在 Rails 5 中执行此操作的方法,也许这应该是公认的答案?
    • 这对于 >= 4.2 绝对正确,但我的问题是针对 4.1.x 的
    【解决方案2】:

    更新:Rails 4.2 及更高版本中的语法发生了变化。有关新语法,请参阅 Tomasz's answer below


    我们升级到 Rails 4.1.4,我再次尝试了相同的代码,这次成功了。我放了

    config.custom_deliver_proc = ->(mailer, mailable, recipient) do
      mailer.delay.send_email(mailable, recipient)
    end
    

    在初始化器的结尾,不确定放置是否有影响。

    我仍然不确定为什么相同的代码现在有效而以前无效,但我的理论是这是 Rails 4.1.0 的问题,在 4.1.4 升级中已修复。希望这对其他人有帮助!

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2016-07-18
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多