Rails测试《十一》添加邮件发送程序及测试邮件发送程序2014-03-15讲到测试邮件发送程序,我们首先要让系统可以发送邮件。我们先来给系统添加发送邮件的功能。Action Mailer in Rails 3是一个不错的视频教程,大家可以参考。还有就是http://guides.rubyonrails.org/action_mailer_basics.html中更加详细的介绍。添加邮件发送程序发送邮件要保证我们有目标邮箱,所以呢,我们的用户要有一个属性:email。还是拿我的blog项目作为练习项目。我们在用户注册的时候给他发一封邮件。首先我们创建一个初始化文件config/initializers/setup_mail.rb,初始化邮箱相关的信息。
ActionMailer::Base.smtp_settings = { :address=> "smtp.163.com", :port => 25, :domain => "163.com", :user_name=> "woaiguanshui2012", :password => "123456asdf", :authentication => "plain", :enable_starttls_auto => true}
我们使用163的邮箱作为邮件发送服务器,需要我们在上面有一个注册用户,这里我注册一个woaiguanshui201,密码是123456asdf。创建邮件发送程序然后用rails g mailer命令创建一个mailer程序。rails g mailer user_mailer命令会创建app/mailers/user_mailer.rb文件。
class UserMailer < ActionMailer::Base default :from => "woaiguanshui2012@163.com"end
在里面添加一个方法,用来在用户注册的时候给用户发邮件。
class UserMailer < ActionMailer::Base default :from => "woaiguanshui2012@163.com"def registration_confirmation(user) mail(:to => user.email, :subject => "Registered") end end
创建邮件内容模板邮件的内容也可以通过模板来实现,和controller的action对应有一个view一样。我们的mailer的方法也需要一个view来做模板。创建app/views/user_mailer/registration_confirmation.text.erb文件,在文件中写入下面的内容。Thank you for registering! 调用邮件发送程序上下最后一步了,就是在用户注册成功之后,调用这个mailer程序的registration_confirmation方法,就可以发送我们预定义的模板文件中的内容了。我们把用户注册的方法修改一下,userscontroller的create方法。
def create @user = User.new(params[:user])if @user.save UserMailer.registration_confirmation(@user).deliverflash[:notice] = "sign up successfully!"signin(@user) redirect_to root_path elseflash.now[:notice] = "sign up failed!"render :newend end
UserMailer.registration_confirmation(@user).deliver上面这一行是我们新加入的,就是发邮件用的。这时候启动我们的服务rails s,然后注册一个用户,然后看看用户的邮箱,就应该有了一封从woaiguanshui2012@163发来的邮件,标题是Registered,内容是thank you for registering!。这就说明我们的邮件发送程序正常工作了。丰富邮件内容模板我们还可以丰富一下邮件的内容,比如添加用户的信息。修改registration_confirmation.text.erb文件。
Hi, <%= @user.nickname %>Thank you for registering!Welcome to come back!
这就需要我们在registration_comfirmation方法中添加一个返回的变量@user。
def registration_confirmation(user) @user = usermail(:to => user.email, :subject => "Registered")end