什么是ActionMailer default_url_options?

时间:2017-05-14 07:44:43

标签: 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
  }

2 个答案:

答案 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更好。 这就是我们这样做的原因。