Rubyと筋肉とギターとわたし

エンジニア二年目の雑魚です。プログラミング・ギター・筋トレのことをメインにブログを書いていきます。

Heroku + Rails + Sendgridでメール送信ができない

f:id:rdwbocungelt5:20181022120235p:plain

どうもてぃです。

今回のことで3日ほど時間を溶かしました。

同じようなことではまってる人が見当たらなかったので、記事にします。

環境

以下僕がやった設定を書きます。

公式ドキュメントの設定

Heroku公式のドキュメント通りにやっていきました。

ドキュメント通りです。まじで。

devcenter.heroku.com

今回は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で確認できます。

=== amazon-ban-staging 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」で確認することが出来ます。

f:id:rdwbocungelt5:20181023130534p:plain

RACK_ENVRAILS_ENVstagingへ、SENDGRID_PASSWORDSENDGRID_USERNAMEheroku addons:add sendgrid:starterをやった際に自動的に設定されます。 ます ここで足りないのは、 SENDGRID_API_KEY

Sendgridの画面から生成して設定をします。

$ heroku addons:open sendgrid

でブラウザとともに、Sendgridのダッシュボードが開きます。

開いたら、 Settings -> API Keysを開き、 Create API Keyをクリック。

f:id:rdwbocungelt5:20181023133406p:plain

適当なAPI Key Nameを設定し、アクセスはFull Accessへ(プロジェクトに応じて変更してください)。

Create & Viewをクリックすると、以下のような画面でkeyが表示されます。

f:id:rdwbocungelt5:20181023141316p:plain

黒く塗りつぶしているところをクリックするとコピーされるので、これをターミナル上からHerokuの環境変数に設定します。

$ heroku config:set SENDGRID_API_KEY='さっきコピーしたKey'

以上、必要な設定は終わり。

これで、適当なところでActionMailerを動かせばいい。

メールが届かない

書いてる通りに設定を行って、いろんな記事を渡り歩いたんですが、メールが送信できない。

というよりも、メール送信はできているけど、Sendgrid経由でメールが送信できていないようでした。

ローカルから実際にSendgrid経由でメールを送ってみたコードが以下(公式に書いてるのと同じ)。

github.com

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様様です。