Azureでドメインを購入しそのサブドメイン宛のメール内容を他所のAPIへPOSTする (Azure DNSzoneとSendGridを利用)


# はじめに

「Microsoft Azureで購入したドメインへメール送信をし、そのメール内容を指定したAPIへPostする」といった内容を実施する機会がありました。

本記事では以下の項目に分けてその手順を示します。

0. Azureでドメインを購入
0. SendGridでのWhiteLabel設定
0. Azure DNS zoneでのSendGridのWhiteLabel用レコード設定
0. SendGridでのメール取り込みWebhook設定
0. Azure DNS zoneでのSendGridへのメール取り込み用レコード設定
0. メールを送信してテスト

# 対象者

* Azureを利用し、送信したメール内容を自分らで管理しているAPIへPostしたい人
* 年間$11.99かかるがドメインをAzure上で購入して良い人(別サービスでのドメインもAzure DNSzoneで扱えます)

# 前提条件

* Azureのアカウントを所持している

# 設定

## Azureでドメインを購入

Azureには"APP SERVICE DOMAIN"というサービスがあり、これを利用することで、Azure内でドメインを購入することができます。

① Azure Portal画面から"App Service Domains"というサービスを選択

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/91562/ee3d3397-d863-ed70-ed65-4cb574623464.png "skitch.png")

② "Add"ボタンをクリック

③ 購入するドメインを決定し購入する

現状(2017年11月)では、Azure内で購入できるドメイン料金は年間一律で$11.99(USD)のようです。また、ドメイン購入後のドメイン管理画面にて、ドメインの自動更新をOFFにすることができます。(デフォルトでは自動更新)

![skitch2.png](https://qiita-image-store.s3.amazonaws.com/0/91562/230ebaba-83a4-24a0-28e6-aa3b0bb46606.png "skitch2.png")


## SendGridでのWhiteLabel設定

SendGridを利用する目的は、"Inbound Parse"機能で受信したメール内容を別サービスのAPIへPostすることなのですが、"Inbound Parse"機能を利用するには、WhiteLabel(※)というドメイン元(Azure)が利用先(SendGrid)へドメイン利用を許可する設定をAzureとSendGridで行う必要あります。

※: Whitelabelとは → [【公式ドキュメント】Whitelabel概要](https://sendgrid.kke.co.jp/docs/User_Manual_JP/Settings/Whitelabel/index.html)

① Azure Portal画面から"SendGrid Accounts"サービスを選択

![sendgrid1.png](https://qiita-image-store.s3.amazonaws.com/0/91562/3d764964-0dde-3130-7641-ce73d1a1fe7d.png "sendgrid1.png")

② "Add"ボタンを選択し、SendGridのアカウントを作成する

このとき、SendGridの料金プランは無料枠(Free)で問題ないです。

![sendgrid2.png](https://qiita-image-store.s3.amazonaws.com/0/91562/8a33b5bf-f203-abb6-9c5c-94a787ccd98b.png "sendgrid2.png")


③ AzureのSendGridアカウント画面の"Manage"ボタンを選択し、SendGridサービスの管理画面へ遷移する

![sendgrid3.png](https://qiita-image-store.s3.amazonaws.com/0/91562/0e076866-0f87-572b-ab85-01e594648881.png "sendgrid3.png")

④ SendGridへログインし"Settings"の"Whitelabels"を選択する

![sendgrid4.png](https://qiita-image-store.s3.amazonaws.com/0/91562/0710fd7b-b57b-d09a-9b9a-4fa33726e906.png "sendgrid4.png")


⑤ 新規Whitelebelとして、"em"をサブドメインとしたWhitelabelを作成する

whitelabelのサブドメインは"em"を利用することは強制ではないですが、[公式ドキュメント](https://sendgrid.kke.co.jp/docs/User_Manual_JP/Settings/Whitelabel/domains.html)には、以下の様な記載があります。

> Domain Whitelabelを設定するドメインの前に、サブドメインを付けます。他で使用していない好きな名前を付けられますが、とくに希望がなければ「em」や「em1」といったサブドメイン名を推奨します。

![sendgrid5.png](https://qiita-image-store.s3.amazonaws.com/0/91562/faee5dc2-8637-aa74-74f5-643ee79ffa27.png "sendgrid5.png")


⑥ 作成したWhitelabel設定に、以下のように3レコード分のレコード設定があることを確認する

このとき、AzureのDNS zone設定前では"VALID"のカラムは"X(invalid)"になっています。これはAzure DNS zoneにて対応のDNSレコード設定を追加するとOKになります。

![sendgrid6.png](https://qiita-image-store.s3.amazonaws.com/0/91562/16271874-5d45-ff67-9544-7064c0a92cf1.png "sendgrid6.png")


## Azure DNS zoneでのSendGridのWhiteLabel用レコード設定

SendGridにてWhitelabel設定後、DNS zoneという購入したドメインのDNS管理をするサービスにて、Whitelabelドメインの設定をします。

① AzureのApp Service Domainから"DNS zone"を選択する。

![dnszone1.png](https://qiita-image-store.s3.amazonaws.com/0/91562/9026c5f3-9ff2-448e-48c0-e32c013e2689.png "dnszone1.png")

② "Record set"ボタンを選択し、SendGridで作成したWhitelabelの3レコード分の設定を行う。

![sendgrid7.png](https://qiita-image-store.s3.amazonaws.com/0/91562/4abab9dc-a92e-ce64-cee4-1ddb90f193ab.png "sendgrid7.png")


## SendGridでのメール取り込みWebhook設定

Whitelabel設定後、SendGridの"Inbound Parse"機能でメール取り込み設定を行います。

はじめにSendGrid側での設定をします。

① SendGridの"Settings"の"Inbound Parse"を選択する。

![inbound1.png](https://qiita-image-store.s3.amazonaws.com/0/91562/4ffe6887-17ec-1b9c-2699-c1c65f2ff02f.png "inbound1.png")

② Addボタンを選択し、メールの宛先とするサブドメイン名と取り込んだメール内容のPost先(Webhook先)のWeb APIのURLを設定する。

![inbound2.png](https://qiita-image-store.s3.amazonaws.com/0/91562/01c90f4c-0219-45dd-f896-7c488c4027af.png "inbound2.png")


## Azure DNS zoneでのSendGridへのメール取り込み用レコード設定

Azure DNS zoneにて、SendGridで設定した"Inbound Parse"に対するDNS設定を行います。

① DNS zone設定にて、作成したメール取り込み用サブドメインと`mx.sendgrid.net`の対であるMXレコードを設定する。

![inbound3.png](https://qiita-image-store.s3.amazonaws.com/0/91562/b6640819-65e5-0dd1-d57a-cfc898f46f3e.png "inbound3.png")


## メールを送信してテスト

以上にてすべての設定が終わったので、メールを送信し、設定が正しく反映されているかを確認します。

① 任意のユーザー名で作成したメール取り込み用サブドメインへメールを送信する。

![mail.png](https://qiita-image-store.s3.amazonaws.com/0/91562/460b3340-ad5b-f8ea-b532-fd90d3b15a50.png "mail.png")

② SendGridの"Inbound Parse"で設定した、POST先のAPIのURL宛にHTTP POSTリクエストがやってきているか、ログを確認する。

ログが確認できれば成功です！

# おわりに

SendGridの設定は少しややこしいと感じました。Whitelabelの設定が複雑さの要因になっています。

AzureのDNS zoneにて各レコードがどの機能を担っているのかを把握しておくことが重要だと思います。

# 参考

* [【SendGrid公式】Setting Up the Inbound Parse Webhook](https://sendgrid.com/docs/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html)
* [【Qiita記事】SendGridでメールを受信してAWSのAPIGateway/Lambdaに渡す](https://qiita.com/monamu/items/77459b6bdb02e8bc2585)