跳到内容

Ruby on Rails/ActionMailer

来自维基教科书,自由的教科书

注意: 以下文档直接来自 Rails API 文档

ActionMailer 允许您使用邮件模型和视图从应用程序发送电子邮件。

要使用 ActionMailer,您需要创建一个邮件模型。

bin/rails mailer Notifier

生成的模型继承自ActionMailer::Base。电子邮件通过在模型中创建方法来定义,这些方法随后用于设置要在邮件模板中使用的变量,以更改邮件上的选项或添加附件。

示例

 class Notifier < ActionMailer::Base
   def signup_notification(recipient)
     recipients recipient.email_address_with_name
     from       "[email protected]"
     subject    "New account information"
     body       "account" => recipient
   end
 end

邮件方法具有以下可用配置方法。

  • recipients接受一个或多个电子邮件地址。这些地址是您的电子邮件将被发送到的地址。设置 To: 标头。
  • subject您的电子邮件的主题。设置 Subject: 标头。
  • from您正在发送的电子邮件来自谁。设置 From: 标头。
  • cc接受一个或多个电子邮件地址。这些地址将收到您的电子邮件的副本。设置 Cc: 标头。
  • bcc接受一个或多个电子邮件地址。这些地址将收到您的电子邮件的密件副本。设置 Bcc: 标头。
  • sent_on邮件发送的日期。如果未设置,则标头将由传递代理设置。
  • content_type指定邮件的媒体类型。默认为 text/plain。
  • headers指定要为邮件设置的附加标头,例如 headers ‘X-Mail-Count’ => 107370。

body 方法具有特殊行为。它接受一个散列,该散列生成一个以散列中每个键命名的实例变量,其中包含键指向的值。

例如,body "account" => recipient 将导致一个名为 @account 的实例变量,其值为 recipient,可以在视图中访问。

邮件视图

[编辑 | 编辑源代码]

与 ActionController 类似,每个邮件类都有一个相应的视图目录,其中该类的每个方法都在其中查找与其名称相同的模板。要定义要与邮件一起使用的模板,请创建一个与邮件模型中方法同名的 .rhtml 文件。例如,在上面定义的邮件中,模板位于

app/views/notifier/signup_notification.rhtml

将用于生成电子邮件。

在模型中定义的变量可以在视图中作为实例变量访问。

默认情况下,电子邮件以纯文本形式发送,因此我们模型示例的样本视图可能如下所示

 Hi <%= @account.name %>,
 Thanks for joining our service! Please check back often.


发送 HTML 邮件

[编辑 | 编辑源代码]

要以 HTML 形式发送邮件,请确保您的视图(.rhtml 文件)生成 HTML 并将媒体类型设置为 html。

class MyMailer < ActionMailer::Base
    def signup_notification(recipient)
      recipients recipient.email_address_with_name
      subject    "New account information"
      body       "account" => recipient
      from       "[email protected]"
      content_type "text/html"   #Here's where the magic happens
    end
  end

多部件邮件

[编辑 | 编辑源代码]

您可以显式指定多部件邮件

class ApplicationMailer < ActionMailer::Base
    def signup_notification(recipient)
      recipients      recipient.email_address_with_name
      subject         "New account information"
      from            "[email protected]"

      part :content_type => "text/html",
        :body => render_message("signup-as-html", :account => recipient)

      part "text/plain" do |p|
        p.body = render_message("signup-as-plain", :account => recipient)
        p.transfer_encoding = "base64"
      end
    end
  end

多部件邮件也可以隐式使用,因为 ActionMailer 将自动检测并使用多部件模板,其中每个模板都以操作的名称命名,后跟媒体类型。每个这样的检测到的模板将被添加为邮件的单独部分。

例如,如果存在以下模板

  • signup_notification.text.plain.rhtml
  • signup_notification.text.html.rhtml
  • signup_notification.text.xml.rxml
  • signup_notification.text.x-yaml.rhtml

每个都将被渲染并作为邮件的单独部分添加,具有相应的媒体类型。相同的 body 散列将传递给每个模板。

可以使用 attachment 方法添加附件。

示例

class ApplicationMailer < ActionMailer::Base
    # attachments
    def signup_notification(recipient)
      recipients      recipient.email_address_with_name
      subject         "New account information"
      from            "[email protected]"

      attachment :content_type => "image/jpeg",
        :body => File.read("an-image.jpg")

      attachment "application/pdf" do |a|
        a.body = generate_your_pdf_here()
      end
    end
  end

配置选项

[编辑 | 编辑源代码]

这些选项在类级别指定,例如 ActionMailer::Base.template_root = "/my/templates"

  • template_roottemplate root 决定模板引用将从中进行的基准。
  • logger记录器用于生成有关邮件运行的信息(如果可用)。可以设置为 nil 以不进行记录。与 Ruby 自己的记录器和 Log4r 记录器兼容。
  • server_settings允许对服务器进行详细配置
    • :address允许您使用远程邮件服务器。只需将其从默认的“localhost”设置更改即可。
    • :port如果您的邮件服务器不是在端口 25 上运行,您可以更改它。
    • :domain如果您需要指定 HELO 域名,您可以在此处进行。
    • :user_name如果您的邮件服务器需要身份验证,请在此设置中设置用户名。
    • :password如果您的邮件服务器需要身份验证,请在此设置中设置密码。
    • :authentication如果您的邮件服务器需要身份验证,您需要在此处指定身份验证类型。这是一个符号,可以是 :plain、:login 或 :cram_md5 之一。
  • raise_delivery_errors如果电子邮件无法发送,是否应该引发错误。
  • delivery_method定义传递方法。可能的值是 :smtp(默认)、:sendmail 和 :test。Sendmail 假设存在于“/usr/sbin/sendmail”中。
  • perform_deliveries确定是否实际执行 deliver_* 方法。默认情况下,它们是开启的,但这可以关闭以帮助功能测试。
  • deliveries保留通过 Action Mailer 使用 delivery_method :test 发送的所有邮件的数组。最适合单元测试和功能测试。
  • default_charset用于主体和编码主题的默认字符集。默认为 UTF-8。您也可以在方法内部使用 @charset 选择其他字符集。
  • default_content_type用于邮件主体部分的默认媒体类型。默认为“text/plain”。您也可以在方法内部使用 @content_type 选择其他媒体类型。
  • default_mime_version用于邮件的默认 mime 版本。默认为 nil。您也可以在方法内部使用 @mime_version 选择其他值。在使用多部件邮件时,如果在方法内部未设置 @mime_version,它将被设置为“1.0”。
  • default_implicit_parts_order当邮件被隐式构建时(即多个部分从指定了媒体类型的模板中组装起来),此变量控制部分的排序方式。默认为 ["text/html", "text/enriched", "text/plain"]。数组中先出现的项目在邮件客户端中具有更高的优先级,并且在 mime 编码邮件中最后出现。您也可以在方法内部使用 @implicit_parts_order 选择其他顺序。
华夏公益教科书