HerokuアドオンなSendGridを独自ドメインで使用するまでの3ステップ


[SendGrid Advent Calendar 2016](http://qiita.com/advent-calendar/2016/sendgrid)の18日めの記事です。

Herokuではカスタムドメイン機能を使用することで、アプリケーションを独自ドメインで運用することができます。SendGridのアドオンを使用することで、簡単にSendGridにサインアップし、無料利用の範囲内で、アプリケーションから送信元を独自ドメインにしたメール配信もできるわけですが、この組み合わせでの一連の作業がまとまっている記事を見かけることがない(ような気がする)ので、しゅるっとまとめてみました。

# 目標

独自ドメインAppから、SendGridを使って、送信元が独自ドメインのメールを送信できるようにする

# 前提

* この記事では、利用する独自ドメインを`example.com`として話を進めます。
* 無料の範囲(Starterプラン)では、[月12,000通までの配信数制限](https://elements.heroku.com/addons/sendgrid)があります。

# 用意するもの

* Herokuアカウントと、動かそうとしているアプリケーション
* 利用するドメインと、これを管理するネームサーバ

# 1. Herokuにカスタムドメインを設定する

* `heroku domains:add www.example.com` などとして、アプリケーションのカスタムドメインとして www.example.com を追加します。
* `heroku domains` として、設定済みのカスタムドメインに対応するDNS Targetを確認します。
* ネームサーバの設定を変更し、設定したカスタムドメインのホスト名に対するCNAMEレコードを、確認したDNS Targetに向けるように設定します。

より詳しくは、[Herokuが公開している記事](https://devcenter.heroku.com/articles/custom-domains)を参照してください。

# 2. SendGrid Addonを利用開始する

* `heroku addons:create sendgrid:starter` として、SendGridアドオンを設定します。
* `heroku config` とし、環境変数に設定されたSendGridの認証情報(`SENDGRID_USERNAME`, `SENDGRID_PASSWORD`)を確認します。
* 作成したアプリケーションから、上記で確認した認証情報を使用して(またはアプリケーション内から上記の環境変数へアクセスして)、メールを送信できることを確認します。

より詳しくは、[Herokuが公開している記事](https://devcenter.heroku.com/articles/sendgrid)を参照してください。

ここまでやれば、ひとまずメールは送れるようになります。
しかしながら、このまま独自ドメインからのメールを送りますと、受信側メールサーバから見たときに、送信元サーバの正当性が確認できません。Gmailでは、受信メールに以下の図のように "sendgrid.me経由" な文字列が表示されます。

![Kobito.nPiSID.png](https://qiita-image-store.s3.amazonaws.com/0/1329/85d9a067-d15c-2409-4e75-baa671d8ebad.png "Kobito.nPiSID.png")


これは、メールのFromは`@example.com`なのに、送信元はsendgrid.meのサーバから送られているぞ、という判定がされてしまっているためです。そこで、最後のステップとして、Domain Whitelabelにより、`@example.com`なメールがSendGrid経由で送られることを設定することにします。

_※ 2016/12/20 16:48更新: 記事初出時は、DMARC判定について言及しておりましたが、Whitelabel設定とDMARC判定とは関係がないため、当該記述については削除しました。_

# 3. Domain Whitelabelを設定する

* `heroku addons:open sendgrid` として、Herokuアプリケーションに設定したSendGridアドオンのダッシュボードを開きます。
* 左側のメニューから Settings > Whitelabels > Domains に進み、 "Add New Domain(Add Whitelabel)" のフォームを開きます。
* メールの送信元となる独自ドメインの情報を入力します。ここで、メールの送信元として @example.com を使用する場合、Domain に example.com と指定します。Subdomain は他のレコードと重複しなければ何を指定してもOKです。

![Kobito.hZkCfp.png](https://qiita-image-store.s3.amazonaws.com/0/1329/08fd337c-6de2-a5b1-eb6e-6142e8293ec0.png "Kobito.hZkCfp.png")

* 設定後に表示されるCNAMEレコードのリストを、自身のネームサーバに設定します。

![Kobito.SMBapK.png](https://qiita-image-store.s3.amazonaws.com/0/1329/59d515cd-6ebc-83b9-1fca-313d74f6c6be.png "Kobito.SMBapK.png")

設定完了後に "Validate Record" ボタンを押して、設定状況を検証します。検証が完了すれば、独自ドメインからのメールの送信元を正しく検証できるようになります。(新しいレコードをすぐに確認できない場合は、手元から設定したレコードのCNAMEが引けるか確認してみたり、少し時間を置いてからリトライしてみましょう。)

より詳しくは、[SendGridの日本代理店である構造計画研究所さんがまとめている記事](https://sendgrid.kke.co.jp/docs/Tutorials/D_Improve_Deliverability/using_whitelabel.html)を参照してください。

# おわりに

* 既存の記事をまとめただけです。すみません。
* Whitelabel は、この他にEmail Link WhitelabelとIP Whitelabelがあり、よりメールの信頼性を高めるのに効果的です。IP Whitelabelは無料の範囲では使用できませんが、どのようなものかは把握しておいたほうが良いでしょう。
* メールの通数が増えてくる場合や、重要な用途でメールを用いることになる場合は、構造計画研究所さんにコンタクトして、日本でのサポートをいただけるようアカウントを作り直した方が良いと思います。

# 参考

* [Custom Domain Names for Apps | Heroku Dev Center](https://devcenter.heroku.com/articles/custom-domains)
* [SendGrid | Heroku Dev Center](https://devcenter.heroku.com/articles/sendgrid)
* [独自ドメインを利用する - ドキュメント | SendGrid](https://sendgrid.kke.co.jp/docs/Tutorials/D_Improve_Deliverability/using_whitelabel.html)
* [独自ドメイン利用（Whitelabel）および設定時のDNSレコードについて、詳しく教えてください – サポート](https://support.sendgrid.kke.co.jp/hc/ja/articles/203703439-%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%88%A9%E7%94%A8-Whitelabel-%E3%81%8A%E3%82%88%E3%81%B3%E8%A8%AD%E5%AE%9A%E6%99%82%E3%81%AEDNS%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-%E8%A9%B3%E3%81%97%E3%81%8F%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)