如何让自定义主机为设计邮件工作?

时间:2012-05-21 23:57:26

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我有域名应用' www.mysite.com'这是托管Drupal和' app.mysite.com'托管Rails应用程序。

我的情况是设计邮件网址指向' 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上像魅力一样工作,但网址主机指向www.mysite.com而不是app.mysite.com并抛出404错误。

如何将其指向正确的主机?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

我查看了使用子域帮助方法发送电子邮件的设计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方法中定义主机名,而不是遍历所有这些方法。

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

在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') %>