您好,登錄后才能下訂單哦!
講到測(cè)試郵件發(fā)送程序,我們首先要讓系統(tǒng)可以發(fā)送郵件。我們先來(lái)給系統(tǒng)添加發(fā)送郵件的功能。
Action Mailer in Rails 3是一個(gè)不錯(cuò)的視頻教程,大家可以參考。
還有就是http://guides.rubyonrails.org/action_mailer_basics.html中更加詳細(xì)的介紹。
添加郵件發(fā)送程序
發(fā)送郵件要保證我們有目標(biāo)郵箱,所以呢,我們的用戶要有一個(gè)屬性:email。
還是拿我的blog項(xiàng)目作為練習(xí)項(xiàng)目。
我們?cè)谟脩糇?cè)的時(shí)候給他發(fā)一封郵件。
首先我們創(chuàng)建一個(gè)初始化文件
config/initializers/setup_mail.rb,初始化郵箱相關(guān)的信息。
- 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的郵箱作為郵件發(fā)送服務(wù)器,需要我們?cè)谏厦嬗幸粋€(gè)注冊(cè)用戶,這里我注冊(cè)一個(gè)woaiguanshui201,密碼是123456asdf。
創(chuàng)建郵件發(fā)送程序
然后用rails g mailer命令創(chuàng)建一個(gè)mailer程序。
- rails g mailer user_mailer
命令會(huì)創(chuàng)建app/mailers/user_mailer.rb文件。
- class UserMailer < ActionMailer::Base
- default :from => "woaiguanshui2012@163.com"
- end
在里面添加一個(gè)方法,用來(lái)在用戶注冊(cè)的時(shí)候給用戶發(fā)郵件。
- class UserMailer < ActionMailer::Base
- default :from => "woaiguanshui2012@163.com"
- def registration_confirmation(user)
- mail(:to => user.email, :subject => "Registered")
- end
- end
創(chuàng)建郵件內(nèi)容模板
郵件的內(nèi)容也可以通過(guò)模板來(lái)實(shí)現(xiàn),和controller的action對(duì)應(yīng)有一個(gè)view一樣。我們的mailer的方法也需要一個(gè)view來(lái)做模板。
創(chuàng)建app/views/user_mailer/registration_confirmation.text.erb文件,在文件中寫(xiě)入下面的內(nèi)容。
- Thank you for registering!
調(diào)用郵件發(fā)送程序
上下最后一步了,就是在用戶注冊(cè)成功之后,調(diào)用這個(gè)mailer程序的registration_confirmation方法,就可以發(fā)送我們預(yù)定義的模板文件中的內(nèi)容了。
我們把用戶注冊(cè)的方法修改一下,userscontroller的create方法。
- def create
- @user = User.new(params[:user])
- if @user.save
- UserMailer.registration_confirmation(@user).deliver
- flash[:notice] = "sign up successfully!"
- signin(@user)
- redirect_to root_path
- else
- flash.now[:notice] = "sign up failed!"
- render :new
- end
- end
UserMailer.registration_confirmation(@user).deliver
上面這一行是我們新加入的,就是發(fā)郵件用的。
這時(shí)候啟動(dòng)我們的服務(wù)rails s,然后注冊(cè)一個(gè)用戶,然后看看用戶的郵箱,就應(yīng)該有了一封從woaiguanshui2012@163發(fā)來(lái)的郵件,標(biāo)題是Registered,內(nèi)容是thank you for registering!。
這就說(shuō)明我們的郵件發(fā)送程序正常工作了。
豐富郵件內(nèi)容模板
我們還可以豐富一下郵件的內(nèi)容,比如添加用戶的信息。修改registration_confirmation.text.erb文件。
- Hi, <%= @user.nickname %>
- Thank you for registering!
- Welcome to come back!
這就需要我們?cè)趓egistration_comfirmation方法中添加一個(gè)返回的變量@user。
- def registration_confirmation(user)
- @user = user
- mail(:to => user.email, :subject => "Registered")
- end
在模板中使用url的話,比如說(shuō)edit_user_url(@user.id, :host => "localhost:3000"),這時(shí)候就只能使用_url方法,不能使用_path方法,同時(shí)還需要指定host。這是因?yàn)猷]件客戶端沒(méi)有web的上下文環(huán)境,不像controller中是有web的上下文環(huán)境的,所以不需要指定host。當(dāng)然,每次指定還是比較麻煩的,你也可以在前面創(chuàng)建的配置文件config/initializers/setup_mail.rb中添加下面的一樣。
- ActionMailer::Base.default_url_options[:host] = "localhost:3000"
這樣就可以省略u(píng)rl中的host參數(shù)了。
在郵件中添加附件
- def registration_confirmation(user)
- @user = user
- p_w_uploads["rails.png"] = File.read("#{Rails.root}/public/p_w_picpaths/rails.png")
- mail(:to => "#{user.name} <#{user.email}>", :subject => "Registered")
- end
再次注冊(cè)用戶,然后登錄用戶的郵箱,就會(huì)發(fā)現(xiàn)收到了一封帶有附件的郵件。
關(guān)于郵件發(fā)送還有很多,大家在使用和設(shè)計(jì)的過(guò)程中會(huì)有更多的體會(huì)。比如說(shuō)我們現(xiàn)在的發(fā)送郵件和用戶注冊(cè)是同步處理的,這樣的話,大量用戶注冊(cè),就會(huì)嚴(yán)重拖慢系統(tǒng),甚至拖垮系統(tǒng)。郵件沒(méi)有必要和用戶注冊(cè)同步處理,可以做成異步的,可以做成獨(dú)立的job。這時(shí)候郵件發(fā)送就需要獨(dú)立出來(lái),可以搞成一個(gè)郵件隊(duì)列,只要在用戶注冊(cè)的時(shí)候發(fā)送一個(gè)郵件消息給郵件隊(duì)列,由隊(duì)列負(fù)責(zé)具體的發(fā)送工作就可以了。
測(cè)試郵件發(fā)送程序
關(guān)于郵件測(cè)試有下面幾個(gè)目的
可以從兩個(gè)方向來(lái)測(cè)試郵件,一個(gè)是單元測(cè)試,一個(gè)是功能測(cè)試。在單元測(cè)試中,我們?cè)谝粋€(gè)隔離的環(huán)境中運(yùn)行郵件程序,內(nèi)容是受控的,然后和模擬數(shù)據(jù)比較輸出的內(nèi)容。在功能測(cè)試中,我們?cè)赾ontroller和model中正確的使用郵件發(fā)送程序,測(cè)試在正確的時(shí)間發(fā)送了正確的郵件。
默認(rèn)情況下,測(cè)試環(huán)境是不能發(fā)郵件的。他們只會(huì)把郵件加入ActionMailer::Base.deliveries數(shù)組,通過(guò)判斷數(shù)組不為空,就可以知道郵件是否發(fā)送成功。
測(cè)試郵件就是兩件事:
test/unit/user_mailer_test.rb
上面的測(cè)試中,首先測(cè)試郵件隊(duì)列是否不為空,然后測(cè)試郵件的目標(biāo)地址是否正確。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。