2011-06-29 23 views
10

我試圖推遲通知電子郵件發送給用戶註冊我的應用程序。電子郵件使用ActionMailer發送,我撥打InitMailer。我試圖推遲工作的方式是使用collectiveidea的delayed_jobhttps://github.com/collectiveidea/delayed_job。要做到這一點,你可以看到,我定義方法initial_email後指定handle_asynchronously如何使用delayed_job使Rails 3.0 ActionMailer異步運行?遇到參數錯誤

class InitMailer < ActionMailer::Base 
    default :from => "[email protected]" 

    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) 

此外,當我設置我的代碼沒有延遲時,電子郵件w (除了它減慢了我的應用程序等待Gmail服務器的事實)

這裏的錯誤在哪裏?我怎樣才能讓延遲郵件正確發送?

回答

10

由於Rails3實現郵件程序的方式,對於delayed_jobs有一些不尋常的解決方法。舉例來說,你已經看到了推遲的郵件,你寫

ExampleMailer.delay.example(user) 

雖然通常你會在方法定義後寫handle_asynchronously,在郵寄這個聲明(出於某種原因)的情況下,防止延遲工作從工作。

所以在這個代碼,完全省略聲明:

class InitMailer < ActionMailer::Base 
    default :from => "[email protected]" 

    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 
+0

謝謝!這是我的煩惱的答案。希望我和像yoU這樣的人一起工作! – geb2011

+0

太棒了。我只是浪費了2天的時間來解決這個問題(也是一個攔截器導致失敗的問題,Gmail不希望接受來自我的開發環境的電子郵件)。 – Clay

+0

我會用Mandrill代替Gmail發送電子郵件,即使是在開發環境中。 – Dean

相關問題