欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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大概代码:
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"就可以了