如何配置Rails ActionMailer的主机名?

21

我正在编写一个非常传统的忘记密码电子邮件 - 我想通过发送包含在链接中的密码更改令牌来向用户发送电子邮件,以便他们可以单击该链接以更改其密码。我通过传统的ActionMailer发送电子邮件。

如果我使用普通的link_to标签

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

我从邮件中获取了一个相对链接,这没什么用。

如果我加上

:only_path => false,则会出现错误,提示我需要设置default_url_options[:host]。ActionController文档暗示您可以通过在控制器中重写#default_url_options方法来完成此操作。肯定有一种配置选项可以告诉Rails主机名是什么,而无需添加我的自己的配置文件、解析等等。


+1 对于问题和答案,这很奇怪……为什么在 Action Mailer 上设置这个? - Sam Saffron
3
发送电子邮件时,没有HTTP请求来获取这些值。 - Pascal
7个回答

37

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哈希中有一个“悬挂”逗号。我想编辑它,但这是SO上禁止的1个字符编辑。 - engineerDave
我感觉自己快要疯了。这对我来说行不通。 - Noah Passalacqua

26

顺便提一下,你可能也想设置 :protocol => 'https'。

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

感谢使用 :protocol => 'https' 指针。使用 'portal.example.com' 似乎无法正常工作,至少在使用 Devise 邮件发送器时如此。生成的 URL 始终以 'https://example.com/' 开头,而不考虑子域名。 - Kevin

4

还有一种替代方案,详见http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/

这个解决方案的优点在于不需要任何配置(因此更为简便),只要从控制器中发送电子邮件即可正常工作。

但是,如果您计划通过其他方式发送电子邮件(例如通过命令行或响应另一个电子邮件),则需要使用静态配置。


这是一个不错的建议,但我需要静态配置。由于某种原因,我发现越来越多的处理需要在网页请求之外进行。 - edebill
当前链接:http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/ - Sudhir

0

在Rails 3.1中,直接设置default_url_options已被弃用。请改用url_for

添加参数:protocol以覆盖默认值(http),:protocol => 'https://'。这将创建以"https://..."开头而不是默认的"http://"的URL。


0
有趣的是,我遇到了和你一样的问题,但是在进行单元测试时(遵循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' }

-1

在Rails 3.1中,直接设置default_url_options已经被弃用。

请使用url_for助手来创建它:

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

-2

你能做到吗?

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

5
邮件发送程序无法获取该请求。 - John Douthat
没错。我可以将它作为电子邮件生成的参数之一传递 - 但我们刚刚决定将这封特定的电子邮件发送自我们的应用服务器,而不是Web前端。我认为这意味着我需要创建一个包含前端网站URL的自定义配置文件。 - edebill
糟糕,我错过了邮件部分。 - Rob Di Marco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接