0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-10

前提条件 - 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です。

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.」というフラッシュメッセージを含む / が表示されます。

スクリーンショット 2019-12-10 12.46.52.png

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

スクリーンショット 2019-12-10 12.46.55.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コマンドの実行からログが表示されるまでには少し時間がかかります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?