【Ruby on Rails】Cloud9 + Heroku + SendGridで本番環境からメールを飛ばす
現在Udemyでこのような講座をやっていまして
開発環境はCloud9、デプロイ先はHerokuでのお話です。
Herokuでの準備
Heroku>Dashboard>左ペインManage Account>Billing
でクレカ情報登録をしておきます。
Cloud9のコンソールにてheroku addons:create sendgrid:starter
Herokuのダッシュボードよりアプリのページを見ると
Sendgridが連携されているのがわかります。ここをクリックすると、SendGridのページへ飛びます。
「なんか問題あったらメール送るから!メルアド教えてくれ!」みたいなポップアップがでますが、もうすでにapp********@heroku.com
というメルアドがフォームには入っています。とにかくボタンを押してみましたが、だめだw
もう一回Gmailで登録し直しました。
SendGridでの設定
左のSettings>Credentials>New Credentials
からusername
, password
の設定。mail
にチェックを入れます。
Heroku用の環境変数設定
Cloud9のコンソールにて、
heroku config:set SENDGRID_USERNAME=yourusername
heroku config:set SENDGRID_PASSWORD=youruserpassword
先ほどSendGridで登録したユーザーネームとパスワードを設定します。
開発環境の環境変数設定
チュートリアルでは.zshrc
に記述しているようですが、dotenv(dotenv-rails)
を使います。
公式を見るとGemfileのトップに記述するようですが、まあruby
のすぐ後にしました。
source 'https://rubygems.org' ruby "2.2.4" gem 'dotenv-rails', :groups => [:development, :test]
bundle install
したあとは忘れずに.gitignore
に.env
を追加。そしてプロジェクトのルートにて.env
ファイルを作成し、
SENDGRID_USERNAME=yourusername SENDGRID_PASSWORD=yourpassword
と記述しておきます。
ActionMailer設定
config/environment.rb
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 }
ここの答えを見るとCloud9はport587
をブロックするようだから、2525とか別のポートにしたほうがいいぜ!みたいなことが書いてありましたが、その通りにすると今度は本番環境にてうまくいかなくなりましたので、おとなしく587
を指定しました。
config/environments/development.rb
config.action_mailer.delivery_method = :development config.action_mailer.default_url_options = { host: 'yourappname.c9users.io/', port: $PORT, protocol: 'https' }
チュートリアルのコメント欄には下記のように
config.action_mailer.delivery_method = :development config.action_mailer.default_url_options = { host: '$IP', port: $PORT }
host: $IP
かもしくはhost: '$IP'
にしろ、みたいなことが書いてありましたが、真っ赤な嘘やで。
config/environments/production.rb
config.action_mailer.delivery_method = :smtp config.action_mailer.default_url_options = { :host => 'yourherokuappname.herokuapp.com', :protocol => 'https'}
git origin heroku master
でHerokuへプッシュしたのち、ユーザー登録画面(Deviseを使用しています)から、自分のEmailを登録してみると、メールが届きます(結構時間かかる?それでも数分くらいだったような気も)
おまけ:letter_opener_webを使用して開発環境でのメールの確認
Gemfile
gem 'letter_opener_web', '~> 1.2.0', :group => :development # 私は何もオプション無しで``group :development``内にgem 'letter_opener_web'としました・・・
bundle install # or bundle install --without production
routes.rb
Your::Application.routes.draw do . . if Rails.env.development? mount LetterOpenerWeb::Engine, at: "/letter_opener" end . . end
config/environments/development.rb
config.action_mailer.delivery_method = :letter_opener config.action_mailer.default_url_options = { host: 'yourappname.c9users.io/', port: $PORT, protocol: 'https' }
ユーザー登録後、
https://yourappname.c9users.io/letter_opener
にアクセスすると、認証メールが確認できます。