Rails在线程中发送邮件不起作用

时间:2014-12-18 18:12:36

标签: ruby-on-rails ruby

我正在尝试在单独的帖子中发送电子邮件(出于预算原因,我现在不想要resque等)。 当我在没有线程的情况下调用mail函数时发送电子邮件,但是当我将它包装在一个线程中时,没有发送电子邮件。

#Thread.new do
    puts "hello1"
    mail(to: "myemail@etc.etc", subject: "blah blah",body: some_var.text)
    puts "hello2"
 # end

所以这段代码可行,但是当我取消注释时,电子邮件不会被发送(但我看到“hello1 hello2”打印出来,我可以进入邮件功能,所以线程正在调用该函数并完成,但是没有发送邮件)。

我正在使用Rails 4.16,开发模式(Webrick从Rubymine运行)。

3 个答案:

答案 0 :(得分:0)

如果它在邮件程序模型中

class MyMailer < ActionMailer::Base
  def my_method
    mail # ...
  end
end

然后它没有发送电子邮件,因为您还需要在其上调用.deliver,因此当您在线程中运行时,您不会返回mail对象,但thread - 主要问题。当你有类似的东西时,它可能会运行:

class MyMailer < ActionMailer::Base
  def my_method
    Thread.new do
      mail().deliver # parameters to mail method as needed 
    end
  end
end

答案 1 :(得分:0)

我尝试使用@ leszek-zalewski私有的解决方案,但它不适用于我。

我所做的是从模型中(我触发电子邮件操作的地方)我改变了它:

之前(在我的NotificationMailer&lt; ActionMailer :: Base中):

  def login_email()

    subject = 'New Login'

    Thread.new do 
      mail(to: "XYZ", subject: subject).deliver
    end
  end

现在(在管理模型中):

  def after_database_authentication
    Thread.new do
      NotificationMailer.login_email().deliver
    end
  end

我删除了NotificationMailer中的Thread.new块

然后你去!

我希望它有所帮助。

答案 2 :(得分:0)

您可以使用SuckerPunch后端的ActiveJob(rails 4.2中的库存和rails 4+的activejob_backport)在同一进程中执行作业