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 形式发送邮件,请确保您的视图(.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 选择其他顺序。