【问题标题】:How do I configure the hostname for Rails ActionMailer?如何为 Rails ActionMailer 配置主机名?
【发布时间】:2010-10-22 09:14:45
【问题描述】:

我正在处理一个相当传统的忘记密码电子邮件 - 我想通过电子邮件向用户发送一个嵌入在链接中的密码更改令牌,他们可以单击该链接来更改密码。我正在通过传统的 ActionMailer 发送电子邮件。

如果我使用普通的 link_to 标签

<%= link_to "click here", :controller => foo, :action => 'bar', :token => token %>

我从电子邮件中获得了一个相对链接 - 相当无用。

如果我加入

:only_path =&gt; false,然后错误提示我需要设置default_url_options[:host]。 ActionController 文档暗示您可以通过覆盖控制器中的 #default_url_options 方法来做到这一点。肯定有一个配置选项可以告诉 Rails 它的主机名是什么,而无需添加我自己的配置文件、解析它等?

【问题讨论】:

  • 问题和答案都+1,这太奇怪了……为什么在action mailer上有这个设置?
  • 发送电子邮件时,没有 HTTP 请求可以从中获取这些值。

标签: ruby-on-rails actionmailer hostname actioncontroller


【解决方案1】:

你能做到吗

<%="click here", :controller => foo, :action => 'bar', :token => token, :host=>request.host -%>

【讨论】:

  • 无法从邮件程序中获得请求
  • 没错。我可以将它作为参数之一传递给电子邮件生成——但我们只是决定将这封特定的电子邮件移动到从我们的应用程序服务器而不是 Web 前端发送。我认为这意味着我需要制作包含前端网站 URL 的自定义配置文件。
  • doh,错过了它的邮件部分
【解决方案2】:

default_url_options 可从config.action_mailer 获得,应在您的环境的配置文件中进行设置。

例如在config/environments/production.rb:

config.action_mailer.default_url_options = {
  :host => 'www.yourdomain.com'
}

本地测试,修改config/environments/development.rb:

config.action_mailer.default_url_options = {
  :host => '127.0.0.1',
  :port => 3000
}

然后,假设您有一个名为 forgot_password_login 的命名路由,您可以使用以下内容在您的邮件中生成登录链接 URL:

forgot_password_login_url(:token => 'a7s8q15sk2...')

【讨论】:

  • 您的 default_url_options 哈希中没有“悬挂”逗号。我会编辑它,但它是一个 1 字符的编辑,在 SO 上是禁止的。
  • 我觉得我疯了。这对我不起作用
【解决方案3】:

还有另一种选择,如http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/中所述

此解决方案的优点是它不需要任何配置(因此不那么麻烦),并且只要您从控制器内发送电子邮件就可以正常工作。

但如果您打算在不通过控制器的情况下发送电子邮件(例如,从命令行或回复另一封电子邮件),则需要静态配置。

【讨论】:

  • 这是一个很好的提示,但我担心我需要静态配置。出于某种原因,我不断遇到越来越多的需要在网络点击之外进行的处理。
  • 当前链接。 pivotallabs.com/…
【解决方案4】:

顺便说一句,您可能还想设置 :protocol => 'https'。

config.action_mailer.default_url_options = { 
    :host => "portal.example.com", 
    :protocol => 'https' 
}

【讨论】:

  • 感谢 :protocol => 'https' 指针。使用“portal.example.com”似乎不能正常工作,至少对于设计邮件。无论子域如何,生成的 url 都以“example.com”开头)。
【解决方案5】:

Rails 3.1 不推荐直接设置 default_url_options

使用 url_for 助手来创建它:

<%= link_to "click here", url_for(:controller => foo, :action => 'bar', :token => token, :host => 'www.yourdomain.com') %>

【讨论】:

    【解决方案6】:

    在 Rails 3.1 中不推荐直接设置 default_url_options。请改用url_for

    添加参数:protocol 以覆盖默认值(http):protocol =&gt; 'https://'。这将创建以“https://...”开头的 url,而不是默认的“http://”

    【讨论】:

      【解决方案7】:

      有趣的是,我遇到了与您相同的问题,但在单元测试中(同时遵循 Michael Hartl 的 railstutorial)。我的 test.rb 文件中有这一行,但这没有帮助:

      config.action_mailer.default_url_options = { host: 'example.com', protocol: 'http' }
      

      我还在 test.rb 中添加了这样的另一行,令人惊讶的是这解决了问题

      default_url_options = { host: 'example.com', protocol: 'http' }
      

      【讨论】:

        猜你喜欢
        • 2011-06-28
        • 1970-01-01
        • 2011-03-26
        • 2016-04-12
        • 2013-02-20
        • 1970-01-01
        • 2012-04-16
        • 2022-06-15
        • 2021-04-08
        相关资源
        最近更新 更多