10.3 在生产环境中发送邮件

最后更新于:2022-04-01 22:30:09

# 10.3 在生产环境中发送邮件 我们已经成功实现了账户激活和密码重设功能,本节要配置应用,让它在生产环境中能真正地发送邮件。我们首先搭建一个免费的邮件服务,然后配置应用,最后再部署。 我们要在生产环境中使用 SendGrid 服务发送邮件。这个服务是 Heroku 的扩展,只有通过认证的账户才能使用。(要在 Heroku 的账户中填写信用卡信息,不过认证不收费。)对我们的应用来说,入门套餐(免费,写作本书时限制每天最多只能发送 400 封邮件)就够了。我们可以使用下面的命令添加这个扩展: ``` $ heroku addons:create sendgrid:starter ``` 为了让应用使用 SendGrid 发送邮件,我们要配置生产环境的 [SMTP](https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol) 设置,而且还要定义一个 `host` 变量,设置生产环境中网站的地址,如[代码清单 10.56](#listing-sendgrid-config) 所示。 ##### 代码清单 10.56:配置应用在生产环境中使用 SendGrid config/environments/production.rb ``` Rails.application.configure do . . . config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp host = '.herokuapp.com' config.action_mailer.default_url_options = { host: host } ActionMailer::Base.smtp_settings = { :address => 'smtp.sendgrid.net', :port => '587', :authentication => :plain, :user_name => ENV['SENDGRID_USERNAME'], :password => ENV['SENDGRID_PASSWORD'], :domain => 'heroku.com', :enable_starttls_auto => true } . . . end ``` [代码清单 10.56](#listing-sendgrid-config) 中设置了 SendGrid 账户的用户名(`user_name`)和密码(`password`),但是注意,这两个值是从 `ENV` 环境变量中获取的,而没有直接写入代码。这是生产环境应用的最佳实践,为了安全,绝不能在源码中写入敏感信息,例如原始密码。这两个值由 SendGrid 扩展自动设置,[11.4.4 节](chapter11.html#image-upload-in-production)会介绍如何自己定义。如果好奇,可以使用下面的命令查看这两个环境变量的值: ``` $ heroku config:get SENDGRID_USERNAME $ heroku config:get SENDGRID_PASSWORD ``` 现在,应该把主题分支合并到主分支中: ``` $ bundle exec rake test $ git add -A $ git commit -m "Add password resets & email configuration" $ git checkout master $ git merge account-activation-password-reset ``` 然后,推送到远程仓库,再部署到 Heroku: ``` $ bundle exec rake test $ git push $ git push heroku master $ heroku run rake db:migrate ``` 配置好 SendGrid 服务后,在生产环境的演示应用中使用你的电子邮件注册试试。你应该会收到一封激活邮件,如[图 10.20](#fig-activation-email-production) 所示。如果忘记密码(或者假装忘了),可以使用 [10.2 节](#password-reset)实现的功能重设密码,收到的重设邮件如[图 10.21](#fig-reset-email-production) 所示。 ![activation email production](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-11_5733306c5d6a5.png)图 10.20:生产环境中的应用发送的账户激活邮件![reset email production](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-11_5733306c840e0.png)图 10.21:生产环境中的应用发送的密码重设邮件
';