运动鞋耙任务中的ActionMailer

时间:2015-01-07 00:05:15

标签: ruby-on-rails ruby rake actionmailer

我在Ruby on Rails应用程序中整理了一个电子邮件调度程序/发件人。我使用Bunny gem来创建消息队列,我有一个Rufus调度程序,定期将消息放入队列。我正在使用Sneakers rake任务在添加消息时从队列中提取消息。我从命令行启动Sneakers工作程序,如下所示:

WORKERS=Processor rake sneakers:run

代码到达mail()函数然后退出,电子邮件模板甚至没有生成。我在正常的应用程序中使用了电子邮件代码,并将配置转移到了rake任务,所以我知道我的配置是正确的。

应用/工人/ processor.rb

require 'sneakers'
require 'json'
require 'action_mailer'

class Processor
  include Sneakers::Worker
  from_queue :email_queue,
        :env => 'development',
    :ack => true
  Sneakers.configure {}
  Sneakers.logger.level = Logger::ERROR

  Sneakers::Worker.configure_logger(Logger.new('/dev/null'))

  def work(msg)
    string  = msg.force_encoding("ISO-8859-1")
    hash = JSON.parse(string)
    ack!
    UserMailer.test_email(hash).deliver
  end
end

应用/邮寄者/ user_mailer.rb

require 'action_mailer'
require 'fog'
require 'rubygems'

class UserMailer < ActionMailer::Base
  def test_email(hash)
    @order = hash["order"]
    @currentUser = hash["user"]
    @staffCompany = hash["company"]
    mail(to: "some.email@gmail.com", from: "another.email@gmail.com", subject: 'Action Mailer')
  end
end

应用/视图/ user_mailer文件/ test_email.html.erb

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
  </head>
  <body>
    <div class="PlainText">
      Some text goes here
    </div>
  </body>
</html>

配置/环境/ development.rb

config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address: 'smtp.gmail.com',
  port: 587,
  domain: 'gmail.com',
  user_name: 'gmail account',
  password: 'password',
  authentication: 'plain',
  enable_starttls_auto: true}

非常感谢任何帮助!

编辑1: 将模板移动到正确的位置,但模板仍然无法呈现,并且电子邮件未被发送出去。

2 个答案:

答案 0 :(得分:1)

冒着恢复旧线程的风险,我在Google上研究了类似问题时遇到了这个问题。为了其他人的缘故,这是一个过去的想法。

我注意到在您的工作人员中,您在致电ack!之后致电了邮件发件人。 The documentation(请参阅列表后的“作业控制”)说,这中断了报告范式,因为工作程序的最后一行需要返回某个值才能正确地管理队列。我想知道您所看到的是否是它的副作用。

在您的 app / workers / processor.rb 中,尝试更改:

 Exec usp_Employee @name = ?
    Exec usp_Department @ID = ?,@name = ?

收件人:

  def work(msg)
    string  = msg.force_encoding("ISO-8859-1")
    hash = JSON.parse(string)
    ack!
    UserMailer.test_email(hash).deliver
  end

答案 1 :(得分:0)

现在我已经从使用不断从队列中获取消息的Sneakers工作者切换到计划的rake任务,该任务将获取队列中的所有可用消息。我不知道为什么Action Mailer在Sneakers工作者和Rake Task中表现如此不同,但这是一个不错的解决方法,并且有大量关于使用Rufus创建邮件程序rake任务的文档。如果有人有任何见解,请发布,因为我仍然很好奇如何让Sneakers工作人员使用Action Mailer。