そーだいなるらくがき帳

そーだいが自由気侭に更新します。

SendGridのキャンペーンメールを使うときにhttpsを必須にしているとhtmlメールのリンクがエラーになるときの対処法

 SendGridは非常に便利でオミカレでも採用してるのだけど、ある程度の規模になってくるとメルマガの配信を自前の機能だけでやるのは大変になってくる。

party-calendar.net

 そこでSendGridにはキャンペーンメール機能があり、オミカレは2019/07/15現在はそれを使っている。

説明すること

 表題がすべてなのだけどHTSTを有効化しており、httpsを必須にするとキャンペーンメール内のhtmlメールのリンクがエラーになる。 これはクリックトラッキングのため、htmlメール本文内のURLを自動的にSendGridがトラッキング用URLに変換し、そこにアクセスが来たら、元々のURLにリダイレクトするという仕組みのため。 SendGridのトラッキング用URLはデフォルトでHTTPのため次のような動作をする。

  1. HTTPのトラッキングURLにアクセス
  2. HTSTが有効な場合、HTTPSに強制リダイレクト
  3. ラッキングURLはHTTPSに対応していないため証明書エラー

 このような現象になり、ブラウザでアクセスが出来ない。 ユーザ側でインフラ側で設定が必要で、かつ、設定後はSendGridのサポートにSSL TrackingをOn(有効化)にしたい旨の連絡が必要 である。 そこで今回はインフラの設定について説明する。

なお、先にSSL TrackingをOnにしたい旨の連絡をすると下記の設定方法を英語で説明してくれる。

対応方法

 これを解決するにはHTTPSでトラッキングできるように、CDNなり、リバースプロキシなり、でカスタムトラッキングの設定が必要。 推奨方法としてはCDNを使ってSendGridのトラッキングURLのエンドポイントを任意の独自ドメインのURLとしてアクセスできるようにする方法なので今回はそちらを説明する。 オミカレはAWSを使っている都合上、今回CDNはCloudFrontを使った説明をする。 なお下記のURLにある通りCloudFlareであれば公式ドキュメントに丁寧な説明がある。

  1. Prepare a proxy (like web application, nginx, or Amazon API Gateway) to take all traffic for http://mailing.example.com and forward it to http://sendgrid.net .
  2. Set up the proxy to use HTTP or HTTPS. For HTTPS, provide valid SSL certificate for http://mailing.example.com domain.
  3. To forward traffic, set Host HTTP header to http://mailing.example.com domain.
  4. Point the CNAME record to your proxy. For example, CNAME http://mailing.example.com http://proxy.example.com .

英語のドキュメントを雑に翻訳しながらオミカレで説明すると次のとおり。

  1. CDNを作成する
  2. カスタムトラッキングURLのエンドポイントとして上記のCDNにCNAMEを設定する
    エンドポイントはここでは例として links.party-calendar.net を設定したことにする
  3. 上記のCDNに証明書(SSL Certificate)を設定し、HTTPSで受けれるようにする
    忘れがちだがCloudFrontの証明書でAWS Certificate Managerを使う場合、CloudFrontは 米国東部 (バージニア北部) しか使えない
  4. https://links.party-calendar.netCDN)はheaderを透過(forward)するように設定する
  5. CDNのOrigin Domain Nameに sendgrid.net を設定する

 これでhtmlメールの中のトラッキングURLをlinks.party-calendar.netに変更し、 https://links.party-calendar.net => CloudFront => http://sendgrid.net という流れにできる。 CloudFrontに証明書が設定してあるため、SendGridの代わりにHTTPSでもアクセスできるようになるという寸法だ。

f:id:Soudai:20190716104526p:plain
イメージ図

CloudFrontの設定

 もう少し具体的にCloudFrontに設定したことを記載する。 デフォルトから変更したオプションは下記の通り

Origin Domain Name: http://sendgrid.net 
Origin Protocol Policy: HTTPS Only
Forward Headers: All
Forward Query Strings: Yes
Alternate Domain Names (CNAMEs): http://links.party-calendar.net
SSL Certificate: Custom SSL Certificate

設定したら、既存のリンクを利用してアクセスできるか確認する。  CNAMEが設定されており、SendGridに正しくCDNがアクセスできてることを確認できたらSendGridのLink Brandingを設定する

Link Brandingの設定

 CDNを用意したらトラッキングドメインの設定が必要になる。 公式ドキュメントもあるし、UI上で設定することもそんなに多くないのでここまで来れた強者であれば設定できるはずだ。 わからなければサポートに聞こう。

sendgrid.kke.co.jp

 ただし注意点がある。SSL TrackingをOnにするとClick TrackingがOnになるのだ。 最初からにClick Trackingを有効化していれば良いがそうでない場合、現在キャンペーンメールとは別に配信しているメールアドレスもトラッキングURLに変更されてしまう。 これによって意図しない問題が発生することがある。

 そのため、すでにメールを送っていて、今から設定変更をする場合はサブユーザを作って、そちらでLink Brandingの設定することをオススメする。

おまけ

 SendGridはシンプルで強力なのだけど、いざと言う時は英語でやりとりが必要なので構造計画研究所さんなどの正規代理店契約を利用したほうが良いって気持ちになった。

sendgrid.kke.co.jp