- 生成郵件程序模版
rails generate mailer UserMailer account_activation password_reset
- 開發環境中的郵件配置
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :test
host = 'localhost:3000'
config.action_mailer.default_url_options = { host: host }
- 生成application的郵件程序
app/mailers/application_mailer.rb
設置默認的發件人地址
class ApplicationMailer < ActionMailer::Base default
from: "[email protected]"
layout 'mailer'
end
- 生成user的郵件程序
app/mailers/user_mailer.rb
發送賬戶激活鏈接
class UserMailer < ApplicationMailer
def account_activation(user)
@greeting = "Hi"
@user = user
mail to: user.email, subject: "Account activation"
end
def password_reset
@greeting = "Hi"
mail to: "[email protected]"
end
- 賬戶激活的純文本視圖
app/views/user_mailer/account_activation.text.erb
Hi <%= @user.name %>,
Welcome to the Sample App! Click on the link below to activate your account:
<%= edit_account_activation_url(@user.activation_token, email: @user.email) %>
- 賬戶激活的HTML視圖
app/views/user_mailer/account_activation.html.erb
<h1>Sample App</h1>
<p>Hi <%= @user.name %>,</p>
<p>
Welcome to the Sample App! Click on the link below to activate your account:
</p>
<%= link_to"Activate",
edit_account_activation_url(@user.activation_token,
email: @user.email) %>
- 生成的郵件預覽程序
test/mailers/previews/user_mailer_preview.rb
class UserMailerPreview < ActionMailer::Preview
def account_activation
user = User.first
user.activation_token = User.new_token
UserMailer.account_activation(user)
end
def password_reset
UserMailer.password_reset
end
end
- 電子郵件測試
test/mailers/user_mailer_test.rb
require 'test_helper'
class UserMailerTest < ActionMailer::TestCase
test "account_activation" do
user = users(:michael)
user.activation_token = User.new_token
mail = UserMailer.account_activation(user)
assert_equal "Account activation", mail.subject
assert_equal [user.email], mail.to
assert_equal ["[email protected]"], mail.from
assert_match user.name, mail.body.encoded
assert_match user.activation_token, mail.body.encoded
assert_match CGI.escape(user.email), mail.body.encoded
end
end
執行rails test
,發現測試無法通過,錯誤如下:
ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
錯誤原因:config/environments/test.rb
中缺少host
配置,添加config.action_mailer.default_url_options = { host: 'localhost:3000' }