mandrill 破解重置密码指令与设计 2.2.3
Posted
技术标签:
【中文标题】mandrill 破解重置密码指令与设计 2.2.3【英文标题】:mandrill break reset password instruction with devise 2.2.3 【发布时间】:2013-10-03 00:07:15 【问题描述】:我在本地的所有电子邮件都适用于我的 gmail 帐户。但是在生产环境中,我使用mandrill 来传递电子邮件。
我的问题是当用户想要重置密码时。这是我在生产中的电子邮件配置:
config.action_mailer.default_url_options = :host => 'mydomain.com'
config.action_mailer.delivery_method = :smtp
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = false
config.action_mailer.default :charset => "utf-8"
config.action_mailer.asset_host = "mydomain.com"
ActionMailer::Base.default :from => 'hyperrjas@mydomain.com'
config.action_mailer.smtp_settings =
:address => "smtp.mandrillapp.com",
:port => 25,
:user_name => Settings.email.username,
:password => Settings.email.password
这是我的邮件控制器:
require 'digest/sha2'
class UserMailer < Devise::Mailer
default "Message-ID"=>"#Digest::SHA2.hexdigest(Time.now.to_i.to_s)@mydomain.com"
def confirmation_instructions(record, opts=)
set_locale(record)
headers["template_path"] = "user_mailer"
headers["template_name"] = "confirmation_instructions"
headers('X-No-Spam' => 'True', 'In-Reply-To' => 'hyperrjas@mydomain.com')
super
end
def reset_password_instructions(record, opts=)
set_locale(record)
headers["template_path"] = "user_mailer"
headers["template_name"] = "reset_password_instructions"
headers('X-No-Spam' => 'True', 'In-Reply-To' => 'hyperrjas@mydomain.com')
super
end
def unlock_instructions(record, opts=)
set_locale(record)
headers["template_path"] = "user_mailer"
headers["template_name"] = "unlock_instructions"
headers('X-No-Spam' => 'True', 'In-Reply-To' => 'hyperrjas@mydomain.com')
super
end
private
def set_locale(user)
I18n.locale = user.locale || I18n.default_locale
end
end
这是生产中问题的链接:
<%= link_to "Change password", edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>
Mandrill 生成的链接类似于:
http://mandrillapp.com/track/click.php?u=30029014&id=890aac6b235b4802883f75b484d5ac8f&url=http%3A%2F%2Fmydomain.com%2Fusers%2Fpassword%2Fedit&url_id=18754ce20fc88b338f0aa3993686e33be8ab84a1
但是在开发中工作正常:
http://localhost:3000/users/password/edit?reset_password_token=yzYyyZuZArq7ksLZdgh3
当使用点击链接时,我可以看到错误:
You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided
如何使用 mandrill 修复此错误?
谢谢!
【问题讨论】:
您使用哪个提供商来托管生产应用程序? 我的提供商是 digitalocean。谢谢 【参考方案1】:我已经用下一个代码解决了这个问题:
def reset_password_instructions(record, opts=)
set_locale(record)
headers["template_path"] = "user_mailer"
headers["template_name"] = "reset_password_instructions"
headers('X-No-Spam' => 'True', 'In-Reply-To' => 'hyperrjas@mydomain.com')
headers['X-MC-Track'] = "False, False"
super
end
您必须将headers['X-MC-Track'] = "False, False"
添加到您的操作reset_password_instructions
您可以在 http://help.mandrill.com/entries/21688056-Using-SMTP-Headers-to-customize-your-messages#enable-open-and-click-tracking 的 mandrill 帮助中查看文档
谢谢!
【讨论】:
【参考方案2】:如果您在 Mandril 中启用点击跟踪,它不应将您的网址替换为自己的网址。然后您的链接应该按预期工作。试一试,看看是否可以仅对确认电子邮件禁用它:
当您执行 API 调用发送时,请确保设置 "track_clicks": false
https://mandrillapp.com/api/docs/messages.html
或者,您可以创建自定义路由,例如http://localhost:3000/users/password/edit/token/yzYyyZuZArq7ksLZdgh3
,其中password_token
是路径的一部分,而不是参数的一部分(?
之后的部分)。然后,您可以处理该路径并从中获取 password_token
,然后再传递给 Devise。
第一种方法可能更简单。您实际上并不需要对确认电子邮件进行点击跟踪,因为您会根据他们是否访问您的网站并确认来了解他们是否点击!
【讨论】:
在哪里可以关闭点击跟踪?在 Mandrill 面板控件或我的 rails 应用程序中?你能贴一个例子吗?谢谢 自定义路由似乎没有什么区别。有时仍然在 IE8 中崩溃【参考方案3】:如果你愿意在全局范围内关闭它,你可以通过 web UI 来完成。
您可以通过 Mandrillapp 或 Heroku 到达那里。
对于您的应用:
点击 Mandrill > Settings > Sending Defaults > Track Clicks (No click tracking)
【讨论】:
以上是关于mandrill 破解重置密码指令与设计 2.2.3的主要内容,如果未能解决你的问题,请参考以下文章