【Rails】Heroku + Rails + Sendgridでメール送信ができない
どうもてぃです。
今回のことで3日ほど時間を溶かしました。
同じようなことではまってる人が見当たらなかったので、記事にします。
環境
以下僕がやった設定を書きます。
公式ドキュメントの設定
Heroku公式のドキュメント通りにやっていきました。
ドキュメント通りです。まじで。
今回はstaging環境を作成し、Herokuへあげました。
設定はproductionをまるまるコピーしてconfig/environments/staging.rb
を作成し、上記ドキュメント通りにやった感じです。
config.action_mailer.delivery_method = :smtp config.action_mailer.perform_deliveries = true config.action_mailer.smtp_settings = { user_name: ENV['SENDGRID_USERNAME'], password: ENV['SENDGRID_PASSWORD'], domain: 'yourdomain.com', address: 'smtp.sendgrid.net', port: 587, authentication: :plain, enable_starttls_auto: true }
↑をぶち込んだだけ。
Heroku環境変数の設定
Herokuの環境変数はheroku config
で確認できます。
=== Config Vars DATABASE_URL: <database url> HEROKU_POSTGRESQL_NAVY_URL: <navy postgresql url> LANG: en_US.UTF-8 RACK_ENV: staging RAILS_ENV: staging RAILS_LOG_TO_STDOUT: enabled RAILS_SERVE_STATIC_FILES: enabled SECRET_KEY_BASE: <your secret key> SENDGRID_PASSWORD: <your sendgrid password> SENDGRID_USERNAME: <your sendgrid username>
もしくは、 ダッシュボード Settings
配下の Config Vars
の「Reveal Config Vars」で確認することが出来ます。
RACK_ENV
と RAILS_ENV
をstaging
へ、SENDGRID_PASSWORD
と SENDGRID_USERNAME
は heroku addons:add sendgrid:starter
をやった際に自動的に設定されます。
ます
ここで足りないのは、 SENDGRID_API_KEY
。
Sendgridの画面から生成して設定をします。
$ heroku addons:open sendgrid
でブラウザとともに、Sendgridのダッシュボードが開きます。
開いたら、 Settings -> API Keys
を開き、 Create API Key
をクリック。
適当なAPI Key Name
を設定し、アクセスはFull Access
へ(プロジェクトに応じて変更してください)。
Create & View
をクリックすると、以下のような画面でkeyが表示されます。
黒く塗りつぶしているところをクリックするとコピーされるので、これをターミナル上からHerokuの環境変数に設定します。
$ heroku config:set SENDGRID_API_KEY='さっきコピーしたKey'
以上、必要な設定は終わり。
これで、適当なところでActionMailer
を動かせばいい。
メールが届かない
書いてる通りに設定を行って、いろんな記事を渡り歩いたんですが、メールが送信できない。
というよりも、メール送信はできているけど、Sendgrid経由でメールが送信できていないようでした。
ローカルから実際にSendgrid経由でメールを送ってみたコードが以下(公式に書いてるのと同じ)。
gemの dotenv
で.env
を設定し、実際に動かしたのですが、Sendgrid経由でメール送信できている。
SendgridのダッシュボードのActivity
にも表示されている。API Keyに問題があるわけではなさそう。
次にheroku run rails c
で実際にActionMailer
でメールを送信してみましたが、コンソール上にはメール送信が完了したとのログしか残らない。
エラーも表示されない。。。 どうしたものか。
設定を見なおした
trelloを見なおしていたら、config/environments/staging.rb
がなかった時に別でメール設定を行っていたことが発覚しました。
それが、 config/initializers/mail.rb
、こいつ。
if Rails.env.production? ActionMailer::Base.delivery_method = :smtp ActionMailer::Base.smtp_settings = { address: 'smtp.gmail.com', domain: 'gmail.com', port: 587, user_name: ENV['MAIL_ADDRESS'], password: ENV['MAIL_PASSWORD'], authentication: 'plain', enable_starttls_auto: true, } elsif Rails.env.development? ActionMailer::Base.delivery_method = :letter_opener else ActionMailer::Base.delivery_method = :test end
config/environments/staging.rb
にメールの設定を書いているのですが、実際にメールが送られるときにはinitializers
配下が実行されるようで、何も設定していなかった僕はstaging
環境ではすべてtest環境が動くようになっていたのです。
こりゃあ、全部Sendgrid経由でメールが送れないわけですわ。
ということで、config/initializers/mail.rb
へHeroku用にstagingの設定を書き込みました。
if Rails.env.production? ActionMailer::Base.delivery_method = :smtp ActionMailer::Base.smtp_settings = { address: 'smtp.gmail.com', domain: 'gmail.com', port: 587, user_name: ENV['MAIL_ADDRESS'], password: ENV['MAIL_PASSWORD'], authentication: 'plain', enable_starttls_auto: true, } elsif Rails.env.development? ActionMailer::Base.delivery_method = :letter_opener elsif Rails.env.staging? ActionMailer::Base.delivery_method = :smtp ActionMailer::Base.default_url_options = { host: 'yourhost.com' } ActionMailer::Base.perform_deliveries = true ActionMailer::Base.smtp_settings = { user_name: ENV['SENDGRID_USERNAME'], password: ENV['SENDGRID_PASSWORD'], domain: 'herokuapp.com', address: 'smtp.sendgrid.net', port: 587, authentication: :plain, enable_starttls_auto: true } else ActionMailer::Base.delivery_method = :test end
解決
ちょうどGitHubが落ちてしまって、この設定のプルリクがマージできなかったのですが、今朝障害が直ったようでして、僕の方の障害も一緒に直りました。
さすがGitHub様様です。