講到測試郵件發送程序,我們首先要讓系統可以發送郵件。我們先來給系統添加發送郵件的功能。
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).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
上面這一行是我們新加入的,就是發郵件用的。
這時候啟動我們的服務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 = user
- mail(:to => user.email, :subject => "Registered")
- end
在模板中使用url的話,比如說edit_user_url(@user.id, :host => "localhost:3000"),這時候就只能使用_url方法,不能使用_path方法,同時還需要指定host。這是因為郵件客戶端沒有web的上下文環境,不像controller中是有web的上下文環境的,所以不需要指定host。當然,每次指定還是比較麻煩的,你也可以在前面創建的配置文件config/initializers/setup_mail.rb中添加下面的一樣。
- ActionMailer::Base.default_url_options[:host] = "localhost:3000"
這樣就可以省略url中的host參數了。
在郵件中添加附件
- 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
再次注冊用戶,然后登錄用戶的郵箱,就會發現收到了一封帶有附件的郵件。
關于郵件發送還有很多,大家在使用和設計的過程中會有更多的體會。比如說我們現在的發送郵件和用戶注冊是同步處理的,這樣的話,大量用戶注冊,就會嚴重拖慢系統,甚至拖垮系統。郵件沒有必要和用戶注冊同步處理,可以做成異步的,可以做成獨立的job。這時候郵件發送就需要獨立出來,可以搞成一個郵件隊列,只要在用戶注冊的時候發送一個郵件消息給郵件隊列,由隊列負責具體的發送工作就可以了。
測試郵件發送程序
關于郵件測試有下面幾個目的
可以從兩個方向來測試郵件,一個是單元測試,一個是功能測試。在單元測試中,我們在一個隔離的環境中運行郵件程序,內容是受控的,然后和模擬數據比較輸出的內容。在功能測試中,我們在controller和model中正確的使用郵件發送程序,測試在正確的時間發送了正確的郵件。
默認情況下,測試環境是不能發郵件的。他們只會把郵件加入ActionMailer::Base.deliveries數組,通過判斷數組不為空,就可以知道郵件是否發送成功。
測試郵件就是兩件事:
test/unit/user_mailer_test.rb
上面的測試中,首先測試郵件隊列是否不為空,然后測試郵件的目標地址是否正確。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。