4

我有一个域名为“www.mysite.com”的应用程序,它托管着 Drupal,而“app.mysite.com”则托管着 Rails 应用程序。

我的情况是设计邮件 url 指向“www.mysite.com”而不是“app.mysite.com”。

在 devise.rb 中,我的设置如下所示:

config.mailer = "Devise::Mailer"
ActionMailer::Base.default_url_options = { :host => 'app.mysite.com' }

在 production.rb 中:

config.action_mailer.default_url_options = { :host => 'app.mysite.com' } 
ActionMailer::Base.smtp_settings = 
{
  :address   => 'smtp.sendgrid.net',    # SendGrid SMTP server
  :domain    => 'mysite.com',           # SendGrid account domain name 
  :user_name => 'username',             # SendGrid user name
  :password  => 'password',             # SendGrid password
  :enable_starttls_auto => true,
  :port => 587, 
  :authentication => :plain,
}

在 views/devise/mailer/reset_password_instructions.html.erb 中,确认链接如下所示:

<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>

单击忘记密码链接后,它成功发送了电子邮件,并且在 localhost 上的工作方式类似于魅力,但 url 主机指向www.mysite.com而不是app.mysite.com并引发 404 错误。

我怎样才能将它指向正确的主机?

4

2 回答 2

4

看起来设计中的默认行为是从主域发送。

这是一个可能有帮助的页面: https ://github.com/plataformatec/devise/wiki/How-To:-Send-emails-from-subdomains

于 2012-05-22T00:06:21.393 回答
4

在查看了设计 wiki 中描述的使用子域辅助方法发送电子邮件的代码后,我让它工作了。

module SubdomainHelper
  def with_subdomain(subdomain)
    subdomain = (subdomain || "")
    subdomain += "." unless subdomain.empty?
    host = Rails.application.config.action_mailer.default_url_options[:host]
    [subdomain, host].join
  end

  def url_for(options = nil)
   if options.kind_of?(Hash) && options.has_key?(:subdomain)
       options[:host] = with_subdomain(options.delete(:subdomain))
   end
   super
  end
end

这个辅助方法所做的就是检查子域哈希是否存在。如果它存在,则该方法在主机之前添加子域并定义新主机名,否则为默认主机名。我没有经历这个过程,因为由于某种原因它在 rails 3.2 上不起作用,而且由于严格的时间限制,我不想浪费我的时间进一步深入研究它。

我想等等,我为什么不在邮件程序 url_for 方法中明确定义主机名,而不是遍历所有这些方法。

因此,我所做的只是在邮件程序中使用哈希键定义 link_tohost并将值作为我的子域传递。之后它就像一个魅力:)。

在 views/devise/mailer/reset_password_instructions.html.erb 中,确认链接如下所示:

<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token, :host => 'app.mysite.com') %>
于 2012-05-23T02:45:25.933 回答