Railsチュートリアル 第11章 アカウントの有効化 - 本番環境でのメール送信

# 前提条件 - HerokuにSendGridアドオンを追加する

Herokuにアドオンを追加できるようにするために、まずはHerokuにクレジットカード情報を登録します。

続いて、ローカル環境側で以下のコマンドを入力していきます。

```
>>> pwd
~/docker/rails_tutorial_test/sample_app

heroku addons:create sendgrid:starter
Creating sendgrid:starter on ⬢ warm-woodland-62915... free
Created sendgrid-shallow-54936 as SENDGRID_PASSWORD, SENDGRID_USERNAME
Use heroku addons:docs sendgrid to view documentation
```

無事HerokuにSendGridアドオンを追加できたようです。

# Railsアプリケーション側における、SendGridを使うために必要な設定

本番環境でSendGridを使う場合、production環境のSMTP設定に情報を入力する必要があります。編集が必要なコードは`config/environments/production.rb`です。

```diff:config/environments/production.rb
  Rails.application.configure do
    ...略

    # Ignore bad email addresses and do not raise email delivery errors.
    # Set this to true and configure the email server for immediate delivery to raise delivery errors.
-   # config.action_mailer.raise_delivery_errors = false
+   config.action_mailer.raise_delivery_errors = true
+   config.action_mailer.delivery_method = :smtp
+   host = 'warm-woodland-62915.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
```

## 設定ファイルを記述する際の重要注意

「本番運用するアプリケーションでは、暗号化されていないIDやパスワードのような重要なセキュリティ情報は、**絶対に**ソースコードに直接書き込んではいけない」という注意書きがされています。「PublicなGitHubリポジトリにAWSのアクセスキーをPushした結果、アクセスキーが外部に流出」といった痛ましい事故の事例って、後をたたないのですよね…

# Herokuへのデプロイ

まずは、Gitのトピックブランチをmasterにマージしていきます。

```
# git add -A
# git commit -m "Add account activation"
# git checkout master
# git merge account-activation
```

続いて、リモートリポジトリにプッシュの上、Herokuにデプロイします。

```
# rails test
# git push
# git push heroku
# heroku run rails db:migrate
```

# 本番環境で実際に新規ユーザーを作成してみる

本番環境で実際に新規ユーザーを作成すると、まず「Please check your email to activate your account.」というフラッシュメッセージを含む / が表示されます。

<img width="1174" alt="スクリーンショット 2019-12-10 12.46.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323778/5fa4e312-3ca0-fcca-61e2-d0b02ee75ac0.png">

実際に自分に送られてきたメールに記載されたリンクをクリックすると、以下のようにアカウントの有効化が成功します。

<img width="1174" alt="スクリーンショット 2019-12-10 12.46.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323778/1edf32b7-c414-1740-78e4-fac996e6e159.png">

## アカウントの有効化に関するHerokuのログ

「以下はメールを送った」という動作に関するログです。

```
2019-12-10T03:45:28.790780+00:00 app[web.1]: I, [2019-12-10T03:45:28.790632 #4]  INFO -- : [72e6b4d6-f1cc-4345-96f2-163f1e95a1d3] Sent mail to [private email address] (957.1ms)
2019-12-10T03:45:28.791070+00:00 app[web.1]: D, [2019-12-10T03:45:28.790991 #4] DEBUG -- : [72e6b4d6-f1cc-4345-96f2-163f1e95a1d3] Date: Tue, 10 Dec 2019 03:45:27 +0000
```

以下はメールヘッダーに関するログです。

```
2019-12-10T03:45:28.791074+00:00 app[web.1]: From: noreply@example.com
2019-12-10T03:45:28.791076+00:00 app[web.1]: To: [private email address]
2019-12-10T03:45:28.791079+00:00 app[web.1]: Message-ID: <5def14d7ccfa7_42aeef6d2d8a8697a9@834cf865-0999-4d5c-ba4c-8390d9663545.mail>
2019-12-10T03:45:28.791081+00:00 app[web.1]: Subject: Account activation
2019-12-10T03:45:28.791083+00:00 app[web.1]: Mime-Version: 1.0
2019-12-10T03:45:28.791085+00:00 app[web.1]: Content-Type: multipart/alternative;
2019-12-10T03:45:28.791088+00:00 app[web.1]: boundary="--==_mimepart_5def14d7cab77_42aeef6d2d8a869683";
2019-12-10T03:45:28.791091+00:00 app[web.1]: charset=UTF-8
2019-12-10T03:45:28.791093+00:00 app[web.1]: Content-Transfer-Encoding: 7bit
2019-12-10T03:45:28.791095+00:00 app[web.1]: 
2019-12-10T03:45:28.791097+00:00 app[web.1]: 
2019-12-10T03:45:28.791099+00:00 app[web.1]: ----==_mimepart_5def14d7cab77_42aeef6d2d8a869683
2019-12-10T03:45:28.791101+00:00 app[web.1]: Content-Type: text/plain;
2019-12-10T03:45:28.791103+00:00 app[web.1]: charset=UTF-8
2019-12-10T03:45:28.791105+00:00 app[web.1]: Content-Transfer-Encoding: 7bit
2019-12-10T03:45:28.791107+00:00 app[web.1]: 
```

以下はテキストメールの内容に関するログです。

```
2019-12-10T03:45:28.791109+00:00 app[web.1]: Hi Test Test,
2019-12-10T03:45:28.791110+00:00 app[web.1]: 
2019-12-10T03:45:28.791113+00:00 app[web.1]: Welcome to the Sample App! Click on the link below to activate your account:
2019-12-10T03:45:28.791114+00:00 app[web.1]: 
2019-12-10T03:45:28.791116+00:00 app[web.1]: https://warm-woodland-62915.herokuapp.com/account_activations/aD5kBQuZL2-7s54haN-uAA/edit?email=rapidliner.express%2Btest3%40gmail.com
2019-12-10T03:45:28.791118+00:00 app[web.1]: 
2019-12-10T03:45:28.791119+00:00 app[web.1]: 
2019-12-10T03:45:28.791122+00:00 app[web.1]: ----==_mimepart_5def14d7cab77_42aeef6d2d8a869683
```

以下はHTMLメールの内容に関するログです。

```
2019-12-10T03:45:28.791125+00:00 app[web.1]: Content-Type: text/html;
2019-12-10T03:45:28.791127+00:00 app[web.1]: charset=UTF-8
2019-12-10T03:45:28.791129+00:00 app[web.1]: Content-Transfer-Encoding: 7bit
2019-12-10T03:45:28.791131+00:00 app[web.1]: 
2019-12-10T03:45:28.791133+00:00 app[web.1]: <!DOCTYPE html>
2019-12-10T03:45:28.791135+00:00 app[web.1]: <html>
2019-12-10T03:45:28.791136+00:00 app[web.1]: <head>
2019-12-10T03:45:28.791138+00:00 app[web.1]: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2019-12-10T03:45:28.791139+00:00 app[web.1]: <style>
2019-12-10T03:45:28.791141+00:00 app[web.1]: /* Email styles need to be inline */
2019-12-10T03:45:28.791142+00:00 app[web.1]: </style>
2019-12-10T03:45:28.791144+00:00 app[web.1]: </head>
2019-12-10T03:45:28.791145+00:00 app[web.1]: 
2019-12-10T03:45:28.791147+00:00 app[web.1]: <body>
2019-12-10T03:45:28.791148+00:00 app[web.1]: <h1>Sample App</h1>
2019-12-10T03:45:28.791150+00:00 app[web.1]: 
2019-12-10T03:45:28.791151+00:00 app[web.1]: <p>Hi Test Test,</p>
2019-12-10T03:45:28.791153+00:00 app[web.1]: 
2019-12-10T03:45:28.791154+00:00 app[web.1]: <p>
2019-12-10T03:45:28.791156+00:00 app[web.1]: Welcome to the Sample App! Click on the link below to activate your account:
2019-12-10T03:45:28.791157+00:00 app[web.1]: </p>
2019-12-10T03:45:28.791159+00:00 app[web.1]: 
2019-12-10T03:45:28.791161+00:00 app[web.1]: <a href="https://warm-woodland-62915.herokuapp.com/account_activations/aD5kBQuZL2-7s54haN-uAA/edit?email=rapidliner.express%2Btest3%40gmail.com">Activate</a>
2019-12-10T03:45:28.791162+00:00 app[web.1]: 
2019-12-10T03:45:28.791164+00:00 app[web.1]: </body>
2019-12-10T03:45:28.791165+00:00 app[web.1]: </html>
2019-12-10T03:45:28.791167+00:00 app[web.1]: 
2019-12-10T03:45:28.791168+00:00 app[web.1]: ----==_mimepart_5def14d7cab77_42aeef6d2d8a869683--
```

有効化リンクがクリックされてからRDBが更新されるまでのログは以下のようになります。

```
2019-12-10T03:46:17.761588+00:00 app[web.1]: I, [2019-12-10T03:46:17.761476 #4]  INFO -- : [f983660b-0c34-47b3-b4fb-a0903c117b84] Started GET "/account_activations/aD5kBQuZL2-7s54haN-uAA/edit?email=rapidliner.express%2Btest3%40gmail.com" for 103.5.140.146 at 2019-12-10 03:46:17 +0000
2019-12-10T03:46:17.763762+00:00 app[web.1]: I, [2019-12-10T03:46:17.763691 #4]  INFO -- : [f983660b-0c34-47b3-b4fb-a0903c117b84] Processing by AccountActivationsController#edit as HTML
2019-12-10T03:46:17.763837+00:00 app[web.1]: I, [2019-12-10T03:46:17.763773 #4]  INFO -- : [f983660b-0c34-47b3-b4fb-a0903c117b84]   Parameters: {"email"=>"rapidliner.express+test3@gmail.com", "id"=>"aD5kBQuZL2-7s54haN-uAA"}
2019-12-10T03:46:17.768953+00:00 app[web.1]: D, [2019-12-10T03:46:17.768851 #4] DEBUG -- : [f983660b-0c34-47b3-b4fb-a0903c117b84]   User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "rapidliner.express+test3@gmail.com"], ["LIMIT", 1]]
2019-12-10T03:46:17.847702+00:00 app[web.1]: D, [2019-12-10T03:46:17.847565 #4] DEBUG -- : [f983660b-0c34-47b3-b4fb-a0903c117b84]   SQL (3.0ms)  UPDATE "users" SET "activated" = 't', "activated_at" = '2019-12-10 03:46:17.843519' WHERE "users"."id" = $1  [["id", 103]]
2019-12-10T03:46:17.849425+00:00 app[web.1]: I, [2019-12-10T03:46:17.849334 #4]  INFO -- : [f983660b-0c34-47b3-b4fb-a0903c117b84] Redirected to https://warm-woodland-62915.herokuapp.com/users/103
2019-12-10T03:46:17.849678+00:00 app[web.1]: I, [2019-12-10T03:46:17.849598 #4]  INFO -- : [f983660b-0c34-47b3-b4fb-a0903c117b84] Completed 302 Found in 86ms (ActiveRecord: 3.9ms)
```

この後、有効化されたユーザーのプロフィールページにリダイレクトされています。

# 演習 - 本番環境でのメール送信

## 1. 実際に本番環境でユーザー登録をしてみましょう。ユーザー登録時に入力したメールアドレスにメールは届きましたか?

上述の通りですね。

## 2. メールを受信できたら、実際にメールをクリックしてアカウントを有効化してみましょう。また、Heroku上のログを調べてみて、有効化に関するログがどうなっているのか調べてみてください。

> ヒント: ターミナルから`heroku logs`コマンドを実行してみましょう。 

こちらも上述の通りです。`heroku logs`コマンドの実行からログが表示されるまでには少し時間がかかります。