【2022年】Rails6アプリを本番環境(Heroku)にデプロイ方法を画像付きで徹底解説の続き。
deviseを入れただけだとメール機能がHeroku本番環境で使えないので、SendGridアドオンを追加してDeviseを有効化する手順になります。
ちなみに、僕はSendGridからアカウント凍結されて、サポートに問い合わせても凍結解除してもらえなかったので、新しくherokuでアプリを作り直し、デプロイし直しました。
まじで、SendGridはすぐにアカウント凍結される。。。
Item could not be created:
An error was encountered when contacting the add-on partner to create sendgrid:starter: Error Provisioning User – User status – banned
こうなると、アカウントがbanされた状態になり、Add-onsだけを再作成しても変わりません。
では、早速やっていきましょう。
HerokuのSendGridアドオンを有効にしてAPIキーを生成
以下コマンドでアドオンを追加します。(starterは無料利用プラン)
$ heroku addons:create sendgrid:starter
herokuにログインして、Herokuのアプリ一覧から作成したアプリをクリックして選択します。
アプリのページへ遷移したら、 resourcesタブをクリックし、Add-ons 一覧に追加されているSendGridをクリックしてください。
別タブでSendGridの設定画面が開いて、まずメール認証をしろと出るので、メールアドレスを入力してメール認証する。
メール認証が終わったら、APIキーを作成するので、左メニューバーから 「Settingsタブ」内にある「API Keys」を選択します。
右上の「Create API Key」を押すと下の画面になるので、「API Key Names」にアプリの名称を入力し、「Full Access」 を選択し、「Create & View」をクリックします。
API Key Created画面にあるランダムな文字列がAPIキーになるので、コピーしてメモしておきましょう。
Herokuの環境変数にSendGridのAPIKeyを追加
先ほど、取得したAPIキーをHerokuの環境変数にセットします。
Rails6アプリの設定にAPIキーを直書きするのは危険なので必ず環境変数を使うようにしましょう。
下記コマンドを実行
$ heroku config:set SENDGRID_API_KEY=作成したAPIキー
Setting SENDGRID_API_KEY and restarting ⬢ アプリ名... done, vxx
と出ていればセットされています。
さらに、下記コマンドを実行でheroku config
にSendgridのusername / password
が追加されてるか確認します。
$ heroku config
出力される内容はこんな感じです。
API Keyが反映されていることも確かめておきます。
smtp設定を行う
config/environments/production.rb
に行き、以下の様に追記、変更を行なう。
config.action_mailer.default_url_options = { :host => 'https://www.ドメイン名.com' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:enable_starttls_auto => true,
:address => "smtp.sendgrid.net",
:port => 587,
:domain => "heroku.com",
:authentication => :plain,
:user_name => ENV['SENDGRID_USERNAME'],
:password => ENV['SENDGRID_PASSWORD'],
}
デプロイし、最後にmigrateを忘れずに
$ heroku run rails db:migrate
これでdeviseのサインアップ機能等が使える様になり、メール認証もできるようになるはずです。
僕はこれで、メールがちゃんと届きました。
送信元のメールアドレスを変更したいとき
送信元のメールアドレスを変更したいときは、config/initialisers/devise.rb
の下記の部分を編集すれば送信元のメアドにも反映されます。
config.mailer_sender = 'example@example.com'