📜  期望 actionmailer base nullmail - Ruby (1)

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

介绍:使用 NullMail 替代 ActionMailer Base

在 Ruby on Rails 中,ActionMailer Base 是发送邮件的基础类。但是在测试、开发和生产环境中,我们不总是想要实际发送电子邮件。幸运的是,Ruby on Rails 提供了 NullMail 类,该类不会实际发送电子邮件,而是仅记录日志和输出电子邮件内容。

安装

在您的 Gemfile 中添加下面的代码:

group :test do
  gem 'nullmailer'
end

然后,在控制台中运行 bundle install 以安装 nullmailer gem。

使用

将 ActionMailer 的默认发送器设置为 NullMail:

# config/environments/test.rb

Rails.application.configure do
  config.action_mailer.delivery_method = :null_mail
end

现在,当您的应用程序调用 ActionMailer 发送电子邮件时,它们将被记录到您的应用程序日志中,而不会实际发送电子邮件。这可以确保在测试、开发和生产环境中不会发送意外的电子邮件。

代码示例
class ExampleMailer < ApplicationMailer
  def welcome_email(user)
    @user = user
    @url  = 'https://example.com/login'
    mail(to: @user.email, subject: 'Welcome to My Awesome Site')
  end
end
# config/environments/test.rb

Rails.application.configure do
  config.action_mailer.delivery_method = :null_mail
end

在测试中,您可以检查日志中的电子邮件内容,以确保邮件发送正确:

def test_welcome_email
  ExampleMailer.welcome_email(@user).deliver_now

  assert_equal 1, ActionMailer::Base.deliveries.size
  assert_equal [@user.email], ActionMailer::Base.deliveries.last.to
  assert_equal 'Welcome to My Awesome Site', ActionMailer::Base.deliveries.last.subject
  assert_match(/<h1>Welcome to My Awesome Site<\/h1>/, ActionMailer::Base.deliveries.last.body.encoded)
end
结论

使用 NullMail 替代 ActionMailer Base,可以有效避免在测试、开发和生产环境中发送意外的电子邮件,同时确保您的程序在以后修改时更加稳健和灵活。