我有域名应用' 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错误。
如何将其指向正确的主机?
答案 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') %>