10

我正在尝试在注册我的应用程序时延迟发送给用户的通知电子邮件。电子邮件是使用ActionMailer我调用的 发送的InitMailer。我试图推迟工作的方式是使用collectiveidea的delayed_job https://github.com/collectiveidea/delayed_job。为此,您可以看到我handle_asynchronously在定义方法后指定initial_email

class InitMailer < ActionMailer::Base
  default :from => "info@blahblahblah.com"

  def initial_email(user)
    @user = user
    @url = "http://www.blahblahblah.com"
    mail(:to => user.email,
         :subject => "Welcome to my website!"
         ) 
  end

  handle_asynchronously :initial_email
end

但是,我在日志文件中遇到参数错误"delayed_job.log"

Class#initial_email failed with ArgumentError: wrong number of arguments (1 for 0) - 5 
failed attempts

供您参考,电子邮件使用以下行在控制器中发送:

@user = InitUser.new(params[:init_user])
InitMailer.delay.initial_email(@user)

此外,当我没有延迟地设置我的代码时,电子邮件发送没有问题(除了它减慢了我的应用程序等待 gmail 服务器的速度)

这里的错误在哪里?我怎样才能让延迟的邮件正确发送?

4

1 回答 1

10

由于 Rails3 实现邮件程序的方式,delayed_jobs 有一些不寻常的解决方法。例如,你已经看到为了延迟邮寄,你写

 ExampleMailer.delay.example(user)

虽然通常您必须handle_asynchronously在方法定义之后编写,但在邮件程序的情况下,此声明(出于某种原因)会阻止延迟的工作正常工作。

所以在这段代码中,完全放弃声明:

 class InitMailer < ActionMailer::Base
   default :from => "info@blahblahblah.com"

   def initial_email(user)
     @user = user
     @url = "http://www.blahblahblah.com"
     mail(:to => user.email,
          :subject => "Welcome to my website!"
          ) 
   end

   #No handle_asynchronously needed here
 end
于 2011-07-05T18:39:46.737 回答