これはSendGrid Advent Calendar 2016の17日めの記事です。
空いていたのでピンチヒッターで埋めます。
メール送信前にやらなければならない設定の代表的なものであるSPF/DKIMについてSendGridではどう設定するかを取り上げたいと思います。
SPF/DKIMって結局何?
それぞれの概要は以下のSendGrid公式ブログを読んでみてください。
いずれも送信ドメイン認証という仕組みの代表的なものですが、簡単に言うと以下を保証するための仕組みであるといえます。
SPF: 送信元のIPアドレスはそのドメインから送ることを許可されている
DKIM: 署名されたドメインから送られてきたこと、および配送の途中で改ざんされていないこと
これらの2つを利用したDMARCという仕組みの導入も進んでいますが、その話を進めると長くなるので興味がある人はこの辺を。
DNSの設定
SPF/DKIM共に送信元のDNSにTXTレコードを追加することで実現します。
SPF
以下のような形式で登録します。
example.com. IN TXT "v=spf1 ip4:192.0.2.1 -all"
こんな感じで、このドメインからはこのレコードに記載されているIPアドレスから送信しますよー。ということを送信元のドメインで宣言します。
ちなみにこのドメインというのは、ヘッダFrom(受信者に見えるFromアドレス)ではなくて、エンベロープFrom(=Return-Path)のドメインのことを指します。一部ヘッダFromを検証に使うドメインもあるようですが、RFCで定義されているSPFのチェックはエンベロープFromに対して行うとなっています。
ちなみにSPFレコードといは言いますが、実際にはTXTレコードです。以前実際SPFレコードという種類があったのですが、RFC7208でSPFレコードは廃止され、TXTレコードのみを記述することが推奨されています。なので、「SPFレコード=SPFの認証のための情報を記載したTXTレコード」ということです。
DKIM
DKIMの場合は、
s._domainkey.example.com 300 IN TXT "k=rsa; t=s; p=asdcflakwecrawe(以下略)"
このような形式のレコードを登録します。
<セレクタ>._domainkey.<ドメイン名>
という場所に、公開鍵を設置し、セレクタとドメイン名が分かる形で送信時にヘッダに電子署名を付与します。
では、これらをSendGridで設定するにはどうすればいいでしょうか。
SendGridでのSPF/DKIM設定
設定するにはDomain Whitelabelという機能を使用します。Whitelabelというキーワードは普段あまり聞きなれないと思いますが、日本でよく聞くOEMに近いイメージだと考えてるとわかりやすいと思います。実体としてはSendGridだけど、表面上ユーザが保有するドメインから送られているように見せかける、ということです。
Domain Whitelabelで必要になるレコード
この3つを指定することでSPFもDKIMも指定したドメインで認証が通るようにSendGridが勝手に設定してくれます。
よくある質問
サブドメインがなんで必要なんですか?
エンベロープFromをSUBDOMAIN.DOMAINにして送信するから必要です。こうすることで既存の送信環境と完全に独立したSendGrid送信用の環境を作ることができます。SPFレコード作成の際によく問題になるのが、既に登録されているIPアドレスやincludeが多すぎて、DNSルックアップの数が上限を超えてしまうことなんですが、それが発生しません。
SPFレコードないけど大丈夫ですか?
CNAMEで向けてある先にSendGridが自動的にSPFレコードを登録してくれるので問題ないです。実際にDATAで表示されているドメインのTXTレコードを引くとSPFの情報が取得できることがわかると思います。
DKIMレコードないけど大丈夫ですか?
同上
設定しないとどうなるんですか?
Domain Whitelabelを設定しない場合、エンベロープFromはSendGridのドメインになり、DKIMもSendGridのドメインで署名されます。なので、設定しなくても、SPFもDKIMもpassすることにはなりますが、「sendgrid.me 経由」みたいな表示が受信者に見えてしまいます。
複数ドメイン設定できますか?
はい。Domain Whitelabelは複数設定可能なので、例えばサービスごとに別のドメインを使用しているような場合も1アカウントで問題なく送信することができます。
参考
あとはこの辺にもっと詳しく書いてあるので、詳しく知りたい方はぜひご確認を
Happy Sending!!