ハイパーニートプログラマーへの道

頑張ったり頑張らなかったり

【Ruby on Rails】Cloud9 + Heroku + SendGridで本番環境からメールを飛ばす

現在Udemyでこのような講座をやっていまして

www.udemy.com

開発環境はCloud9、デプロイ先はHerokuでのお話です。

Herokuでの準備

Heroku>Dashboard>左ペインManage Account>Billingでクレカ情報登録をしておきます。

f:id:noriyo_tcp:20160229222234p:plain

Cloud9のコンソールにてheroku addons:create sendgrid:starter

Herokuのダッシュボードよりアプリのページを見ると

f:id:noriyo_tcp:20160229222217p:plain

Sendgridが連携されているのがわかります。ここをクリックすると、SendGridのページへ飛びます。

「なんか問題あったらメール送るから!メルアド教えてくれ!」みたいなポップアップがでますが、もうすでにapp********@heroku.comというメルアドがフォームには入っています。とにかくボタンを押してみましたが、だめだw もう一回Gmailで登録し直しました。

SendGridでの設定

左のSettings>Credentials>New Credentialsからusername, passwordの設定。mailにチェックを入れます。

f:id:noriyo_tcp:20160229222552p:plainf:id:noriyo_tcp:20160229222555p:plainf:id:noriyo_tcp:20160229222556p:plain

Heroku用の環境変数設定

Cloud9のコンソールにて、
heroku config:set SENDGRID_USERNAME=yourusername

heroku config:set SENDGRID_PASSWORD=youruserpassword

先ほどSendGridで登録したユーザーネームとパスワードを設定します。

開発環境の環境変数設定

チュートリアルでは.zshrcに記述しているようですが、dotenv(dotenv-rails)を使います。

github.com


公式を見ると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
}

ruby on rails - Sendgrid via Devise: Attempt to send authentication email leads to OpenTimeout error when using Cloud 9 dev environment - Stack Overflow

ここの答えを見ると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を使用して開発環境でのメールの確認

github.com

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にアクセスすると、認証メールが確認できます。