Ruby on Rails 5 + Devise + SendCloud SMTP 发密码重置邮件 (2017年)
短前言
最近写寓住(yuzhu.me) 需要弄 "忘记密码" 功能,所以要发密码重置邮件,用户点邮件里的链接就可以设置新密码。
邮件服务商选搜狐的 SendCloud 主要考虑到国内的到达率会好一点,速度会稍微快一点。
我之前没正经弄过邮件发送的事情,这次第一次选,根据 v2ex, Ruby China 里其他人的帖子。
最终筛选出来是 SendGrid 和 SendCloud。想了下决定先试试 SendCloud,实在不行再折腾 SendGrid。
吐槽下,关于邮件服务商选择的信息,网上其实都比较老旧,帮助不算特别大(搜搜 ruby china "邮件服务",全是2012年到2015年的,今年2017了。。)
所以在 Ruby China 发了个新帖: 2017 年哪家邮件服务商针对国内的到达率比较好?大家都是用的啥?(在犹豫用 SendCloud / SendGrid)
技术栈:
- Ruby on Rails 5
- Devise
- SMTP 接入 SendCloud
另外一说,如果你没用 devise,或者纯粹就是想自己写密码重置功能,我看这篇英文教程似乎很不错:https://www.railstutorial.org/book/password_reset
总之以下是通过 SendCloud + Rails 5 + Devise 发密码重置邮件的方法
怎么配
文件路径: config/environment/development.rb
,因为我是本地测试所以放 development.rb
里
然后这样配 SMTP(Ghost 没自带代码高亮。。抱歉)
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:address => "smtpcloud.sohu.com",
:port => 25,
:user_name => 'agoodob_test_OWA888',
:password => 'hvOyUTZ4QV7pd888',
:authentication => "login",
:enable_starttls_auto => true
}
注:这里的代码是为了示例而已。直接复制粘贴不会管用,因为这里写的 :user_name 和 :password 是假的。
:user_name 是 SendCloud 的 API_USER
:password 是对应的 API_KEY
既然配置好了我们测试是否管用
在 config/routes.rb 路由文件里添加:
get '/test/reset_password', to: 'test#reset_password'
然后在 app/controllers/test_controller.rb 里写一个叫 reset_password 的新方法:
def reset_password
u = User.last
u.send_reset_password_instructions
render json: u
return
end
可以看到代码是拿最后一个用户,然后发密码重置邮件。
send_reset_password_instructions 来自 devise 。
http://www.rubydoc.info/github/plataformatec/devise/master/Devise/Models/Recoverable
现在方法写好了我们开始测试发邮件。
在浏览器里访问我们刚刚定义的地址:
http://localhost:6001/test/reset_password
(这里 6001 端口只是我个人爱好而已,默认跑 rails s 是 3000 端口)
可以看到最后一个用户的邮箱是 1003211008@qq.com
看看 QQ 邮箱
请求额度+1
进了 QQ 邮箱的垃圾邮箱,我猜是因为发信域名还是测试域名。
但总之 devise 密码重置邮件收到了。
最后
因为博客用的是 Ghost,没评论功能,如果想沟通可以发邮件
guokrfans#gmail.com 谢谢。
希望这篇博客节省了你的时间。
还有一件事
虽然 SendCloud 官方没有 Ruby 或者 Ruby on Rails 的 SDK(截止至2017年10月份)
但实际上他们有给 Ruby 的 Web API 代码示例。只是藏得比较深:
http://www.sendcloud.net/doc/email_v2/code/
后记
后面发现的确是因为测试域名所以进垃圾邮箱,
用 mail.yuzhu.me 这个域名发邮件就完全没问题了。
另外我现在还在用 SendCloud 免费套餐,截至目前(2017年11月13日)只有重置密码用到了邮件,而且用户数也不多,所以现在一天 160 的免费额度还够用。