rails3中使用delayed_job异步发送邮件的方法
程序员文章站
2022-07-14 10:46:30
...
railscasts有个视频,使用delayed_job去发送邮件(http://railscasts.com/episodes/171-delayed-job)
但是呢,rails3的发送邮件的api发生了些许变化。(详情请看:http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3)
发送的方法上也要做些许的修改。这里以我的代码作为示例,做个示范。
这里的UserMailer大概代码:
这个是rails3的ActionMailer,很赞
有了上面的代码,Controller中直接调用
但是,现在的代码是直接进行发送的,这使得用户在操作的时候,会卡一下,如果放到后台去发送就不会有这个问题。
在rails的lib目录底下的mailing_job.rb文件内容,做些许的变化
到这里就基本上搞定了,把UserController里的直接发送的代码换成:
delayed_job记得上最新版,gemfile里直接写gem "delayed_job", "2.1.0.pre"就可以了
但是呢,rails3的发送邮件的api发生了些许变化。(详情请看:http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3)
发送的方法上也要做些许的修改。这里以我的代码作为示例,做个示范。
这里的UserMailer大概代码:
class UserMailer < ActionMailer::Base default :from => "admin@example.com" def registration_confirmation(user) @user = user mail(:to => "#{user.username} <#{user.email}>", :subject => "注册确认") end end
这个是rails3的ActionMailer,很赞
有了上面的代码,Controller中直接调用
UserMailer.registration_confirmation(@user).deliver就可以发送邮件了
def create @user = User.new(params[:user]) if @user.save UserMailer.registration_confirmation(@user).deliver flash[:notice] = "谢谢您的注册,一封注册确认邮件即将发往邮箱#{@user.email},请注意查收!" redirect_to '/login' else render :action => 'new' end end
但是,现在的代码是直接进行发送的,这使得用户在操作的时候,会卡一下,如果放到后台去发送就不会有这个问题。
在rails的lib目录底下的mailing_job.rb文件内容,做些许的变化
class MailingJob < Struct.new(:notifier_method,:user_id) def perform user = User.find(user_id) UserMailer.send(notifier_method, user).deliver end end
到这里就基本上搞定了,把UserController里的直接发送的代码换成:
Delayed::Job.enqueue MailingJob.new(:registration_confirmation, @user.id)
delayed_job记得上最新版,gemfile里直接写gem "delayed_job", "2.1.0.pre"就可以了