📜  预览 mailers rails - Ruby (1)

📅  最后修改于: 2023-12-03 15:28:55.743000             🧑  作者: Mango

预览 Mailers - Rails

在 Rails 应用程序中,Mailer 是用来发送电子邮件的类。Mailer 类似于 Controller,不过与控制器不同之处在于,Mailer 不处理 HTTP 请求和响应,而是通过电子邮件协议发送邮件。

Mailer 类定义在 app/mailers 目录下,文件名以 xxx_mailer.rb 的形式命名,其中 xxx 是你自定义的类名。

配置 Mailers

在 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

创建 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

其中 ApplicationMailerActionMailer::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 方法发送邮件即可。

测试 Mailers

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

该测试用例测试了 UserMailerwelcome_email 方法是否能够正确渲染视图并发送邮件。

在测试方法中,我们首先定义了一个用户(使用 Fixture 机制),然后调用 welcome_email 方法创建邮件对象。接着,我们使用 assert_equalassert_match 等断言方法检查各种条件是否满足。

执行 rails test test/mailers/user_mailer_test.rb 命令即可进行测试。

部署 Mailers

在生产环境中部署 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 的测试和部署也非常简单,只需设置相应的环境变量即可。但是,在发送邮件时要格外小心,确保发送的邮件符合业务需求,不会给用户带来困扰或安全风险。