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
  }

3

注:这里的代码是为了示例而已。直接复制粘贴不会管用,因为这里写的 :user_name 和 :password 是假的。

:user_name 是 SendCloud 的 API_USER
:password 是对应的 API_KEY
1

既然配置好了我们测试是否管用

在 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
12

现在方法写好了我们开始测试发邮件。
在浏览器里访问我们刚刚定义的地址:
http://localhost:6001/test/reset_password
(这里 6001 端口只是我个人爱好而已,默认跑 rails s 是 3000 端口)

6
可以看到最后一个用户的邮箱是 1003211008@qq.com

看看 QQ 邮箱
7
8
9
请求额度+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/

10

后记

后面发现的确是因为测试域名所以进垃圾邮箱,
mail.yuzhu.me 这个域名发邮件就完全没问题了。
另外我现在还在用 SendCloud 免费套餐,截至目前(2017年11月13日)只有重置密码用到了邮件,而且用户数也不多,所以现在一天 160 的免费额度还够用。