跳至内容 跳至搜索

Action Mailer – 轻松发送和测试邮件

Action Mailer 是一个用于设计邮件服务层的框架。这些层用于整合代码,用于发送密码重置邮件、注册欢迎邮件、账单发票,以及任何需要向个人或系统发送书面通知的用例。

Action Mailer 本质上是 Action Controller 和 Mail gem 的一个包装器。它提供了一种使用模板创建邮件的方式,与 Action Controller 使用模板渲染视图的方式相同。

此外,Action Mailer 类还可以用于处理收到的电子邮件,例如允许博客通过电子邮件(甚至可以是从手机发送的)接受新帖子。

您可以在 Action Mailer 基础指南中阅读更多关于 Action Mailer 的信息。

发送邮件

该框架通过初始化您想要在邮件模板中使用的任何实例变量,然后调用 mail 来发送邮件来工作。

它可以很简单地这样做:

class Notifier < ActionMailer::Base
  default from: 'system@loudthinking.com'

  def welcome(recipient)
    @recipient = recipient
    mail(to: recipient,
         subject: "[Signed up] Welcome #{recipient}")
  end
end

邮件正文是通过使用 Action View 模板(常规的 ERB)创建的,该模板包含在 mailer action 中声明的实例变量。

所以,对应上面方法的正文模板可能看起来像这样:

Hello there,

Mr. <%= @recipient %>

Thank you for signing up!

如果收件人是 “david@loudthinking.com”,生成的邮件将如下所示:

Date: Mon, 25 Jan 2010 22:48:09 +1100
From: system@loudthinking.com
To: david@loudthinking.com
Message-ID: <4b5d84f9dd6a5_7380800b81ac29578@void.loudthinking.com.mail>
Subject: [Signed up] Welcome david@loudthinking.com
Mime-Version: 1.0
Content-Type: text/plain;
    charset="US-ASCII";
Content-Transfer-Encoding: 7bit

Hello there,

Mr. david@loudthinking.com

Thank you for signing up!

要发送邮件,只需调用该方法,然后对返回值调用 deliver_now

调用该方法会返回一个 Mail Message 对象。

message = Notifier.welcome("david@loudthinking.com")   # => Returns a Mail::Message object
message.deliver_now                                    # => delivers the email

或者您可以链式调用方法,如下所示:

Notifier.welcome("david@loudthinking.com").deliver_now # Creates the email and sends it immediately

设置默认值

可以设置默认值,这些值将在 Action Mailer 类中的每个方法中使用。要实现此功能,只需调用您从 ActionMailer::Base 免费获得的公共类方法 default。此方法接受一个 Hash 作为参数。您可以使用任何邮件拥有的标头,如 :from 作为键。您也可以将字符串作为键传递,例如 “Content-Type”,但 Action Mailer 会为您处理这个问题,所以您不必担心。最后,也可以传递一个 Proc,它将在需要时进行评估。

请注意,使用此方法设置的每个值都将被覆盖,如果您在 mailer 方法中使用相同的键。

示例

class AuthenticationMailer < ActionMailer::Base
  default from: "awesome@application.com", subject: Proc.new { "E-mail was generated at #{Time.now}" }
  .....
end

配置

Base 类拥有完整的配置选项列表。下面是一个例子:

ActionMailer::Base.smtp_settings = {
  address:        'smtp.yourserver.com', # default: localhost
  port:           '25',                  # default: 25
  user_name:      'user',
  password:       'pass',
  authentication: :plain                 # :plain, :login or :cram_md5
}

下载与安装

可以使用 RubyGems 安装最新版本的 Action Mailer:

$ gem install actionmailer

源代码可以作为 Rails 项目的一部分在 GitHub 上下载。

许可

Action Mailer 在 MIT 许可下发布。

支持

API 文档位于:

Ruby on Rails 项目的错误报告可在此处提交:

功能请求应在此处的 rubyonrails-core 论坛上讨论:

命名空间
方法
D
E
G
V

类公共方法

deliver_all_later(*deliveries, **options)

一次性将多个电子邮件排队,通过 Active Job 发送。当单个作业运行时,它将使用 deliver_now 发送电子邮件。

# File actionmailer/lib/action_mailer/message_delivery.rb, line 9
def deliver_all_later(*deliveries, **options)
  _deliver_all_later("deliver_now", *deliveries, **options)
end

deliver_all_later!(*deliveries, **options)

一次性将多个电子邮件排队,通过 Active Job 发送。当单个作业运行时,它将使用 deliver_now! 发送电子邮件。这意味着消息将绕过 perform_deliveriesraise_delivery_errors 的检查而发送,所以请谨慎使用。

# File actionmailer/lib/action_mailer/message_delivery.rb, line 17
def deliver_all_later!(*deliveries, **options)
  _deliver_all_later("deliver_now!", *deliveries, **options)
end

eager_load!()

# File actionmailer/lib/action_mailer.rb, line 61
def self.eager_load!
  super

  require "mail"
  Mail.eager_autoload!

  Base.descendants.each do |mailer|
    mailer.eager_load! unless mailer.abstract?
  end
end

gem_version()

返回当前加载的 Action Mailer 版本,格式为 Gem::Version

# File actionmailer/lib/action_mailer/gem_version.rb, line 5
def self.gem_version
  Gem::Version.new VERSION::STRING
end

version()

返回当前加载的 Action Mailer 版本,格式为 Gem::Version

# File actionmailer/lib/action_mailer/version.rb, line 8
def self.version
  gem_version
end