자습서 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 입니다.

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."라는 플래시 메시지가 포함된/가 표시됩니다.



실제로 자신에게 보낸 이메일에 나열된 링크를 클릭하면 아래와 같이 계정을 성공적으로 활성화할 수 있습니다.



계정 활성화에 대한 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: [email protected]
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"=>"[email protected]", "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", "[email protected]"], ["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 명령 실행에서 로그가 표시되기까지 약간의 시간이 걸립니다.

좋은 웹페이지 즐겨찾기