Railsチュートリアル第11章 本番環境でメール通知がされない事象の調査と解決まで(自分用メモ)

この記事は、[Railsチュートリアルの第11章4節「本番環境でのメール通知」](https://railstutorial.jp/chapters/account_activation?version=5.1#sec-activation_email_in_production "Railsチュートリアルの第11章4節「本番環境でのメール通知」")にて、メール通知がされない事象が発生した時の、原因調査と解決までの対応をメモ的に記載するものです。

# tl;dr
・第11章4節にてHeroku上でアカウント登録したのにメール来ない。。
・色々ググって試したけどダメだった。
・SendGridアカウントが抑止されていたのが原因でした。サポートに連絡して抑止解除で解決。
・サポートの方に感謝！

# 本題
### 発生した事象
第11章3節までは実装もテストも上手く動いている。しかし、第4節「本番環境でのメール通知」の設定後、Heroku環境でメールが通知されない事象が発生。実施手順は以下の通り。

1. Heroku本番環境のSign up画面からアカウント登録情報入力し、Sign up nowを押下。
2. ルートURLにリダイレクトされ、flashメッセージ“Please check your email to activate your account.“が表示される。
3. **Sign up画面で入力した宛先にメールが届かない。**

### 環境
Railsチュートリアルの推奨要件に準拠(各種gem,Cloud9,Herokuなどなど　2019/2現在)

### 調査事項
#### 調査その１　原因の絞り込み
同様の現象の先行事例がないかTeratail、Qiitaその他ブログを検索。以下が原因であることが多いようですがいずれも当てはまりませんでした。

- クレジットカードが未登録
登録実施済み。そもそも現在の仕様では先に登録完了させないことには、チュートリアル手順内の `heroku addons:create sendgrid:starter` コマンドが成功しないので。

- config/environments/production.rbファイルの定義ミス
以下の2つの定義が間違えがちなようでしたが、特に間違えているようにも思わなかったので、ここではなさそうだなーと。

```
config.action_mailer.delivery_method = :smtp
host = 'hogehoge.herokuapp.com'
```
※上はsmtpの指定ミス、下は本番環境のアドレス定義ミスがしがちな模様

-  タイポ面
 - チュートリアルテキストを再度確認するも、タイポは検知できず。Sign Up時のメールアドレスのタイポもなかった。


また、本番環境のWeb画面上に,We are sorry~などのエラーメッセージは表示されず、利用者側からは一見問題ないように見えます。そこでheroku logsを見てみると、送信されるべきメールに本来記載されているはずのテキストが正常にlog出力されていました。そしてテキスト内のアカウント有効化用URLを開くと、アカウントが有効化されログイン完了状態となりました。以下heroku logsの内容です。

```
(略)

2019-02-14T03:21:24.546313+00:00 app[web.1]: <h1>Sample App</h1>
2019-02-14T03:21:24.546314+00:00 app[web.1]:
2019-02-14T03:21:24.546315+00:00 app[web.1]: <p>Hi thase,</p>
2019-02-14T03:21:24.546316+00:00 app[web.1]:
2019-02-14T03:21:24.546348+00:00 app[web.1]: <p>
2019-02-14T03:21:24.546350+00:00 app[web.1]: Welcome to the Sample App! Click on the link below to activate your account:
2019-02-14T03:21:24.546351+00:00 app[web.1]: </p>
2019-02-14T03:21:24.546353+00:00 app[web.1]:
2019-02-14T03:21:24.546355+00:00 app[web.1]: <a href="https://hogehoge-.herokuapp.com/account_activations/kokonidigetgaattayo/edit?email=hogehoge%40icloud.com">Activate</a>
2019-02-14T03:21:24.546356+00:00 app[web.1]: </body>
2019-02-14T03:21:24.546358+00:00 app[web.1]: </html>
2019-02-14T03:21:24.546642+00:00 app[web.1]: Redirected to https://hogehoge.herokuapp.com/
2019-02-14T03:21:24.546816+00:00 app[web.1]: Completed 302 Found in 1041ms (ActiveRecord: 6.4ms)
2019-02-14T03:21:24.756928+00:00 app[web.1]: Started GET "/" for 103.5.140.164 at 2019-02-14 03:21:24 +0000
2019-02-14T03:21:24.757873+00:00 app[web.1]: Processing by StaticPagesController#home as HTML
2019-02-14T03:21:24.758913+00:00 app[web.1]: Rendering static_pages/home.html.erb within layouts/application
2019-02-14T03:21:24.759402+00:00 app[web.1]: Rendered static_pages/home.html.erb within layouts/application (0.4ms)
2019-02-14T03:21:24.760263+00:00 app[web.1]: Rendered layouts/_shim.html.erb (0.0ms)
2019-02-14T03:21:24.760686+00:00 app[web.1]:Rendered layouts/_header.html.erb (0.3ms)
2019-02-14T03:21:24.761468+00:00 app[web.1]: Rendered layouts/_footer.html.erb (0.6ms)
2019-02-14T03:21:24.762778+00:00 app[web.1]:Completed 200 OK in 5ms (Views: 4.1ms | ActiveRecord: 0.0ms)
(略)
```

ログより、メール送信リクエストは正常にSendgridに渡っており、200 OKも返ってきているので、アプリ側の問題ではなく、Sendgrid周りに不具合がありそうというのが分かりました。


#### 調査その２　SendGridに絞った調査
Sendgridどう調べればいいか分からなかったのですが、HerokuのアカウントからSendgridのアカウントに飛べるんですね。以下はHerokuの管理画面ですが、画面内のSendGridをクリックすれば飛べます。

![スクリーンショット 2019-03-24 2.49.14.png](https://qiita-image-store.s3.amazonaws.com/0/362906/16956960-8dcc-e642-e8fc-fa3696314c5c.png)


飛んだ先のSendGrid管理画面はこんな感じで、トップ画面から最近のメールに関するアクティビティが確認できます。ここではRequestが9件あるのに対して、Deliveredが0%と表示されています。つまり、Rails Tutorial AppからSendGridに対するメール送信リクエストは9件受け付けられているようですが、私がSign Up時に指定したメールアドレス(宛先メールサーバ)は受信をしていないことが分かります。

![スクリーンショット 2019-03-25 3.12.31.png](https://qiita-image-store.s3.amazonaws.com/0/362906/34a64f65-7e51-873c-560f-4501d5cad339.png)

また、Activity画面からも、SendGridはメール送信リクエストを受け付けているが、ステータスはProcessedとなっています。　ステータスの見方については、[SendGridドキュメント メールが届いているか確認する](https://sendgrid.kke.co.jp/docs/Tutorials/C_Manage_Events/using_activity.html "SendGridドキュメント メールが届いているか確認する")を参考にし、正常に宛先メールサーバに送信が完了していればDeliveredになるはずだが、Processedの状態で止まっていることが分かります。

![スクリーンショット 2019-03-25 3.10.06.png](https://qiita-image-store.s3.amazonaws.com/0/362906/15135ad1-dc07-691c-067f-59abe0adc279.png)


この画面をよーく見ると、なにやら画面上部にFlashメッセージが見切れていることに気づくと思います。私はしばらく気づきませんでした。だって画面スクロールしていないのにデフォルトでこれだけ見切れていたらまあ気づきません！このままだと読めないのでメッセージをコピペして表示させてみると、内容は以下でした。

>Your account has been suspended. Please contact Support to regain access.

SendGridが抑止されている。なんで・・・？とは思うものの指示に従いSendGridのサポートに連絡しました。その結果、以下の回答をもらいました。

>Thanks for reaching out to SendGrid Support! I sincerely apologize for any trouble or confusion caused by this. I took this over to the compliance department and their research concluded this account sanction was a false positive by their automated systems. SendGrid leverages many different platforms to determine if a sender is a good fit for our services. Your account has been reactivated at this time.

なるほど。確かにSendGrid側からしたら私のアカウントは、本来的にSendGrid側が想定している理想の使い方ではない、つまりちょっと謎なアカウントなので、自動で利用抑止となってしまうのも分かります。ですが無料で使ってる身なので、こんなこともまああるのね〜くらいで思っておきましょう。この後すぐにアカウントの抑止が解除され、溜まっていたメールが一気に流れてきました以降はRails Tutorial通りメール通知機能が利用できるようになりました。

# 結論
無料ユーザに対してもすぐに対応してくれるSendGridのサポートの方々に感謝。