我不能理解关于电子邮件的一些微不足道的事情,但defaul_url_options中的主机有什么作用?我需要配置smtp设置来配置电子邮件的发送方式,但default_url_options与此相关的是什么?
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
host = '<your heroku app>.herokuapp.com'
config.action_mailer.default_url_options = { host: host }
ActionMailer::Base.smtp_settings = {
:address => 'smtp.sendgrid.net',
:port => '587',
:authentication => :plain,
:user_name => ENV['SENDGRID_USERNAME'],
:password => ENV['SENDGRID_PASSWORD'],
:domain => 'heroku.com',
:enable_starttls_auto => true
}
答案 0 :(得分:21)
default_url_options
设置对于在电子邮件模板中构建链接网址非常有用。通常,需要使用此配置选项设置:host
,即Web服务器的完全限定名称。它与发送电子邮件无关,它只在电子邮件中配置显示链接。
Rails Guides以及ActionMailer::Base
sources中详细记录了设置此项的必要性:
可以使用url_for或命名路由在邮件程序视图中生成URL。与Action Pack中的控制器不同,邮件程序实例没有关于传入请求的任何上下文,因此您需要提供生成URL所需的所有详细信息。
使用url_for时,您需要提供
:host
,:controller
和:action:
<%= url_for(host: "example.com", controller: "welcome", action: "greeting") %>
使用命名路线时,您只需提供
:host
<%= users_url(host: "example.com") %>
因此,要重新编写文档,在网页中,将从传入的请求信息中获取当前Web服务器的名称(将在绝对链接中使用)。但是,您在呈现电子邮件时没有提供此信息(没有请求),这就是您必须手动提供的原因,以便电子邮件中的链接正常运行。
答案 1 :(得分:4)
您是否曾尝试在ActionMailer模板中生成网址?如果您至少做过一次,那么您可能熟悉以下错误:
ActionView::TemplateError (Missing host to link to! Please provide :host parameter or set default_url_options[:host])
这是因为ActionMailer实例没有任何关于传入请求的上下文,因此您需要提供:host,:controller和:action:。如果使用命名路由,ActionPack会为您提供控制器和操作名称。否则,使用url_for帮助程序,您需要传递所有参数。
<%= message_url %>
<%= url_for :controller => "messages", :action => "index" %>
无论您的选择如何,您始终需要提供主机选项以在ActionMailer中生成URL。如ActionMailer指南所示,您基本上有两种方法可以将主机值传递给ActionMailer:
1. set a global value
2. pass the option each time you generate an URL
定义default_url_options比每次传递URL更好。 这就是我们这样做的原因。