use*_*220 15 ruby-on-rails actionmailer
我不能理解关于电子邮件的微不足道的事情,但是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
}
Run Code Online (Sandbox Code Playgroud)
Bor*_*aMa 24
该default_url_options设置对于在电子邮件模板中构建链接URL非常有用.通常,:host需要使用此配置选项设置Web服务器的完全限定名称.它与发送电子邮件无关,它只配置在电子邮件中显示链接.
Rails指南以及ActionMailer::Base来源中都很好地记录了设置它的必要性:
可以使用url_for或命名路由在邮件程序视图中生成URL.与Action Pack中的控制器不同,邮件程序实例没有任何有关传入请求的上下文,因此您需要提供生成URL所需的所有详细信息.
当使用url_for你需要提供
:host,:controller以及:action:Run Code Online (Sandbox Code Playgroud)<%= url_for(host: "example.com", controller: "welcome", action: "greeting") %>使用命名路由时,您只需提供
:hostRun Code Online (Sandbox Code Playgroud)<%= users_url(host: "example.com") %>
因此,要重新编写文档,在网页中,将从传入的请求信息中获取当前Web服务器的名称(将在绝对链接中使用).但是在呈现电子邮件时没有这些信息(没有请求),这就是为什么你必须手动提供它,以便电子邮件中的链接正常工作.
您是否曾经尝试在ActionMailer模板中生成URL?如果您至少做过一次,那么您可能熟悉以下错误:
ActionView::TemplateError (Missing host to link to! Please provide :host parameter or set default_url_options[:host])
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为ActionMailer实例没有关于传入请求的任何上下文,因此您需要提供:host,:controller和:action:。如果使用命名路由,则ActionPack会为您提供控制器和动作名称。否则,需要使用url_for帮助器传递所有参数。
<%= message_url %>
<%= url_for :controller => "messages", :action => "index" %>
Run Code Online (Sandbox Code Playgroud)
无论您选择哪种方式,都始终需要提供主机选项才能在ActionMailer中生成URL。如ActionMailer指南所示,您基本上可以通过两种方法将主机值传递给ActionMailer:
1. set a global value
2. pass the option each time you generate an URL
Run Code Online (Sandbox Code Playgroud)
定义default_url_options比每次传递URL更好。这就是我们这样做的原因。