📅  最后修改于: 2023-12-03 15:28:55.743000             🧑  作者: Mango
在 Rails 应用程序中,Mailer 是用来发送电子邮件的类。Mailer 类似于 Controller,不过与控制器不同之处在于,Mailer 不处理 HTTP 请求和响应,而是通过电子邮件协议发送邮件。
Mailer 类定义在 app/mailers 目录下,文件名以 xxx_mailer.rb
的形式命名,其中 xxx
是你自定义的类名。
在 Rails 中配置邮件系统非常简单,只需要在 config/application.rb
文件的 config.action_mailer
块中设置邮件发送所需的参数即可。以下是常用的 Mailer 配置参数:
config.action_mailer.delivery_method = :smtp # 邮件发送协议,SMTP 是常用的协议之一
config.action_mailer.smtp_settings = {
address: "smtp.example.com", # SMTP 服务器地址
port: 587, # SMTP 服务器端口
domain: "example.com", # 域名
authentication: "plain", # 认证方式
user_name: "username", # 用户名
password: "password", # 密码
enable_starttls_auto: true # 启用 STARTTLS 加密
}
请务必根据你的邮件服务器设置正确的参数。如果你使用的是云服务商提供的邮件服务,如 Gmail、SendGrid 等,一般会提供相应的配置文档,可参考配置。
创建 Mailers 很简单,只需生成一个 Mailer 类,然后在该类中定义发送邮件的方法即可。
你可以使用 Rails 命令行工具生成一个 Mailer:
$ rails generate mailer UserMailer
该命令会在 app/mailers 目录下生成一个名为 user_mailer.rb
的文件和一个名为 user_mailer_test.rb
的测试文件。
打开 user_mailer.rb
文件,你会看到以下代码:
class UserMailer < ApplicationMailer
default from: 'from@example.com'
def welcome_email
@user = params[:user]
@url = 'http://example.com/login'
mail(to: @user.email, subject: 'Welcome to My Awesome Site')
end
end
其中 ApplicationMailer
是 ActionMailer::Base
的子类,用于定义默认的邮件发送选项。在上面的例子中,我们设置了默认的发送人地址为 from@example.com
。
welcome_email
是自定义的发送邮件方法,该方法会渲染 app/views/user_mailer/welcome_email.html.erb 和 app/views/user_mailer/welcome_email.text.erb 两个视图文件,生成 HTML 和纯文本邮件内容。渲染得到的内容可以通过实例变量传递到视图文件中。
最后,mail
方法将根据传递的选项呼叫实际发送邮件的方法,如下所示:
mail(to: @user.email, subject: 'Welcome to My Awesome Site')
该方法会将邮件发送给 @user.email
,主题为 Welcome to My Awesome Site
。
发送邮件非常简单,只需调用 Mailer 类的发送邮件方法即可。例如,在 Controller 中调用邮件发送方法:
class UsersController < ApplicationController
def create
@user = User.new(user_params)
if @user.save
UserMailer.with(user: @user).welcome_email.deliver_now
redirect_to @user
else
render :new
end
end
end
上面的代码会在创建用户成功后发送欢迎邮件给用户。
注意,在调用邮件发送方法时,我们使用了 with
方法传递了一个参数 user
,该参数可以在 Mailer 中使用。
最后,调用 deliver_now
方法发送邮件即可。
Rails 提供了完善的测试机制,可以方便地测试 Mailer 是否正常工作。打开 user_mailer_test.rb
文件,你会看到以下代码:
require 'test_helper'
class UserMailerTest < ActionMailer::TestCase
test "welcome_email" do
user = users(:one)
mail = UserMailer.with(user: user).welcome_email
assert_equal "Welcome to My Awesome Site", mail.subject
assert_equal [user.email], mail.to
assert_equal ["from@example.com"], mail.from
assert_match "Hi", mail.body.encoded
end
end
该测试用例测试了 UserMailer
的 welcome_email
方法是否能够正确渲染视图并发送邮件。
在测试方法中,我们首先定义了一个用户(使用 Fixture 机制),然后调用 welcome_email
方法创建邮件对象。接着,我们使用 assert_equal
和 assert_match
等断言方法检查各种条件是否满足。
执行 rails test test/mailers/user_mailer_test.rb
命令即可进行测试。
在生产环境中部署 Mailers 很简单,只需要在部署时设置相应的环境变量即可。以下是部署 Rails 应用程序时设置邮件发送配置的命令:
$ heroku config:set MAILER_ADDRESS=smtp.example.com MAILER_PORT=587 MAILER_DOMAIN=example.com MAILER_AUTHENTICATION=plain MAILER_USER_NAME=username MAILER_PASSWORD=password MAILER_ENABLE_STARTTLS_AUTO=true
上面的命令设置了 Mailer 发送的 SMTP 服务器地址、端口、域名、认证方式、用户名和密码、是否启用 STARTTLS 加密。
我们已经学习了如何在 Rails 中使用 Mailers 发送电子邮件。Mailer 类是一个非常强大的工具,你可以用它发送各种类型的邮件,例如格式化的 HTML 邮件、包含附件的邮件等。 Mailer 的测试和部署也非常简单,只需设置相应的环境变量即可。但是,在发送邮件时要格外小心,确保发送的邮件符合业务需求,不会给用户带来困扰或安全风险。