會員註冊後,我們可以寄一封驗證信給他們,
不然怎麼會知道他填的是不是他本人的呢?
我們會使用到 Devise 的 Mailer 跟 Devise
那我們就開始吧!
我們在昨天有把 Confirmable 這塊模組解除註解,
所以就不用重新 rollback 及 migrate 了
在 development 的環境中,信件並不會真的被送出,
我們必須要做些設定才會被送出
default_url_options
指的是在我送出去的信件中,信件內容的網址網域是什麼,而我們目前是開發模式,尚未有網域,就先填寫成 localhost 3000
perform_deleveries
這個設定決定於信件會不會真的發送出去,因為我們真的要送出,所以需要設定成 true
# config/environments/development.rb
config.action_mailer.default_url_options = { host: 'http://localhost:3000' }
config.action_mailer.perform_deliveries = true
接下來要設定 email 的相關東西了,這邊我們會用 mailgun
為什麼選他?沒為什麼,因為有免費額度
我們就先跳到 mailgun 官網,完成註冊流程後
切換到 Sending 底下的 Domains
右邊應該會跳出一組 sandboxxxxxx.mailgun.org 的網域
點選進去後,選擇 SMTP,下方就會出現一串 SMTP 的資訊
先留著這頁,我們待會設定會用到
我們需要在 smtp_setting 設定,smtp_setting 裡可以設定一些:
address
是指 SMTP 伺服器的位置,我們使用 mailgun,請填寫剛剛 mailgun SMTP 頁面資訊的 SMTP hostname
的參數
port
設定為 mailgun 推薦的 587
domain
可填寫為你的網域
user_name
為 Mailgun 的 Username,我們在發送信件時, SMTP 會去驗證我們的 user_name 及 password,確定後才會開始寄信動作
password
為 Mailgun 的 Default password
authentication
是指驗證方式為 plain,剛有提到 SMTP 在發送信件以前會驗證寄件人的帳號密碼,在驗證過程中需傳遞資料給伺服器, plain 是在這傳遞過程中的安全驗證方式
enable_starttls_auto
STARTTLS 是一種用於加密通信的協議,SMTP 伺服器用它來保護敏感資訊,在傳輸過程中不被竊聽
像是 user_name 及 password 這種敏感資訊,建議都用環境變數來設定會比較好唷
# config/environments/development.rb
config.action_mailer.smtp_settings = {
address: 'smtp.mailgun.org',
port: 587,
domain: 'ishop',
user_name: ENV['MAILGUN_USERNAME'],
password: ENV['MAILGUN_PASSWORD'],
authentication: 'plain',
enable_starttls_auto: true
}
假設我們希望寄件者是我們服務的 email,就可以到 devise 中做設定
# config/initializers/devise.rb
config.mailer_sender = '<ning@example.com>'
如果沒有自訂信件內容,就會以 devise 預設的內容為主,因為是註冊驗證信,所以我們會先把 mailer 的 view 做出來,再去修改內容
用指令將 devise 的 view 產生
rails g devise:views
到 view 中更改內容
# views/devise/mailer/confirmation_instructions.html.erb
<p>哈囉 <%= @email %>!</p>
<p>請點選下列連結開通帳號:</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
當我們註冊,應該就會收到信囉