今更ながら Ruby on Rails Tutorial をやってみた (その11/その12)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から[**Ruby on Rails Tutorial**](https://railstutorial.jp/)をやってみようと思い立ちました。今回は[前回の記事](https://qiita.com/hideki0145/items/ea13e9ad81d38f2cc6a9)の続きで第11章/第12章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつHyper-V上にインストールしたUbuntu 18.04の環境で進めていきます。

## 第11章 アカウントの有効化 / 第12章 パスワードの再設定

これらの章では指定したメールアドレス宛に認証メールを送ることでアカウントの有効化/パスワードの再設定を行う処理を作成します。RailsのAction Mailerライブラリを使用したメール送信処理の実装について、とても分かり易く説明されています。

> 実はRails 4.xに対応した第2版/第3版のチュートリアルではアカウントの有効化/パスワードの再設定について同一章で一度に取り扱われていました。その為、とてもボリュームの多い章となっていて学習難易度が高かったようです。
> 2つの章に分割され、更に「難易度が高いなぁ」と感じた場合は第11章/第12章については一旦飛ばして第13章に進んでもいいと明記されるようになったので、チュートリアル第1週目の取っ付き易さが上がったと感じます。


さて、チュートリアル内ではHerokuアドオンの「SendGrid」を使用した認証メール送信について説明されていますが、今回は「Gmail SMTP サーバー」から認証メールを送信するように少し改変してみたいと思います。Gmail SMTPサーバーを使用すると、1日2,000通を上限としてメール送信を行うことが可能です。

> 参考
> プリンタ、スキャナ、アプリからメールを送信する
> https://support.google.com/a/answer/176600?hl=ja
> ［Ruby/Rails］メール送信機能の実装方法（Gmail）
> https://qiita.com/tanakadaichi_1989/items/82993ef2ae62a27c618d

### Railsのproduction環境でGmailを使う設定

Gmail SMTP サーバーを使用する為に必要な前準備が3つあります。

1. [Googleアカウントを取得する](https://support.google.com/accounts/answer/27441?hl=ja)
2. [2段階認証プロセスをオンにする](https://support.google.com/accounts/answer/185839?hl=ja)
3. [アプリパスワードを生成する](https://support.google.com/accounts/answer/185833?hl=ja)

それぞれGoogle アカウントヘルプに詳しく方法が書かれているので、そちらを参照してみてください。
(ほとんどの人はGoogleアカウントは既に取得済だと思うので、[2.]から準備すればいいかと思います。)

チュートリアル内ではSendGridを使用する為に`production.rb`の設定を以下のように行っています。

```ruby:config/environments/production.rb
Rails.application.configure do
  .
  .
  .
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = '<your heroku app>.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
```

この箇所を、Gmailから認証メールを送信するように変更すると以下のようになります。

```ruby:config/environments/production.rb
Rails.application.configure do
  .
  .
  .
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = "#{ENV['HEROKU_APPNAME']}.herokuapp.com"
  config.action_mailer.default_url_options = { host: host, protocol: 'https' }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.gmail.com',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['GMAIL_USERNAME'],
    :password       => ENV['GMAIL_PASSWORD'],
    :domain         => 'gmail.com',
    :enable_starttls_auto => true
  }
  .
  .
  .
end
```

ここでは環境変数ENVを使用して、重要なセキュリティ情報をソースコード内に残さないように注意しています。

```sh
heroku config:set HEROKU_APPNAME="HerokuのApp Nameを入力"
heroku config:set GMAIL_USERNAME="Gmailアカウント(xxx@gmail.com)を入力"
heroku config:set GMAIL_PASSWORD="生成したアプリパスワードを入力"
```

現在のチュートリアルはRails 5.1を使用していますが、Rails 5.2にアップデートされた際には環境変数ENVではなく[credential機能](https://railsguides.jp/security.html#%E7%8B%AC%E8%87%AA%E3%81%AEcredential)を使用する方がいいかなと思います。

ここまでの設定を終えてHeroku上のproduction環境でアカウント有効化/パスワード再設定処理を実行すれば、実際にGmailからメール送信されていることでしょう。


それでは、次回 第13章から再開したいと思います。