SendGrid利用時にやるべきこと

# はじめに

今回業務でSendgridを使うことになったのでやるべきこと、やったほうがよさそうなことを机上で調査しWebHookについてはAzureFunctionを作ってみて試してみました。


# ドメイン認証

- ドメイン認証は、SendGridがユーザーの許可を得て、ユーザーの代わりにメールを送信していることを証明するもの
- 具体的にはCNAMEを追加する。
- ちょっとお試ししたい場合はメールアドレスでの認証もできるのでご安心を。

https://docs.sendgrid.com/ja/ui/account-and-settings/how-to-set-up-domain-authentication

# SPF、DKIMの設定

- 絶対やっとくべし。
- 設定に必要なDNSレコードはSendGridの管理画面で出力されるので、これをDNSに設定後SendGridの管理画面で「Verify」を押すだけ。

https://docs.sendgrid.com/ja/ui/account-and-settings/how-to-set-up-domain-authentication#_2-2

# IPアドレスの逆引き設定

- 複数ドメインからメールを送信じゃなくてもやっておいても良いと思う。

https://sendgrid.kke.co.jp/docs/User_Manual_JP/Settings/Sender_authentication/How_to_set_up_reverse_dns.html

# IPアドレス制限

- FromのIPアドレスを固定化できるかは要注意。Azureだとプランによって固定化できなかったりするので。

https://sendgrid.kke.co.jp/docs/User_Manual_JP/Settings/ip_access_management.html

# APIキーのパーミッションを限定的にする

- APIキーをローテーションする機能はないので運用でローテーションするしかなさそう
- APIキーは複数登録できる

https://sendgrid.kke.co.jp/docs/Tutorials/A_Transaction_Mail/manage_api_key.html

# アラートメールの設定

- 送信通数・・・通数で課金されるので設定しておこう
- メールの統計レポート・・・これはなくてもよいかもしれない。

https://sendgrid.kke.co.jp/docs/User_Manual_JP/Settings/alerts.html

# Email Activity

Bounces, Blocksはアラートを設定するまでではないが定期的に見た方が良いかも。
ActivityはWebhook経由でFunctionなどを経由してBlobStorageなどに保存する必要がある

https://sendgrid.kke.co.jp/docs/User_Manual_JP/email_activity.html

FunctionでEventHookを取得するのは簡単。少し古い記事だが今も変わらず利用可能。

https://sendgrid.kke.co.jp/blog/?p=9403&utm_source=google&utm_medium=cpc&utm_content=text&utm_campaign=dsa&gclid=CjwKCAiAzp6eBhByEiwA_gGq5I75g2s1xaE-Pha_-FZ5YiWvz9p3lyJRlQym4QMYZapZDZAxrT06dhoC9zAQAvD_BwE

（追記）AzureFunctionのサンプルも用意しました。こちらを利用してください。

https://qiita.com/uzresk/items/b624c5b27cc417694797

URLの設定画面はこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/71c82f19-09ee-3b32-034c-4a6cfbdc0e8f.png)


実際に動かしてみるとBounceのログはこんな感じでとれる

```json
[
  {
    email: 'example@test.com',
    timestamp: 1674109954,
    'smtp-id': '<14c5d75ce93.dfd.64b469@ismtpd-555>',
    event: 'bounce',
    category: [ 'cat facts' ],
    sg_event_id: 'fjO_iOXzYXsSKWWOR_HUEw==',
    sg_message_id: '14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0',
    reason: '500 unknown recipient',
    status: '5.0.0'
  },
  {
    email: 'example@test.com',
    timestamp: 1674109954,
    'smtp-id': '<14c5d75ce93.dfd.64b469@ismtpd-555>',
    event: 'dropped',
    category: [ 'cat facts' ],
    sg_event_id: 'dhZLeuQ_cPKJZW0q8Xa_lQ==',
    sg_message_id: '14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0',
    reason: 'Bounced Address',
    status: '5.0.0'
  }
]
```

## 注意点

- Webhookのイベントは重複する可能性ある。sg_event_idでユニークになるので集計時は注意すること
- 以下の制約は大事。Functionでサーバレスプランで初回起動に時間がかかってもリトライしてくれるので大丈夫そうですね。
- 受けきれないと消えてしまうので絶対消えちゃダメな場合はAPIGateway→Queueで受けるとよいと思います。
  ```
  SendGridは、HTTPステータスコード 2xx が返されるのを待ちます。
  指定されたURLから 2xx 以外のコードが返された場合は、24時間リトライします。
  リトライキューの最大数は 100,000 です。キューが一杯になった場合は、
  古いリクエストから順に削除されます。リトライ期間内に送信されなかったイベントや、
  キューから削除されてしまったイベントは、そのまま失われてしまいます。
  ```

https://sendgrid.kke.co.jp/docs/API_Reference/Webhooks/event.html


# サービスステータス・障害情報・メンテナンス情報の受信

下記で登録することでサービスを受けられる。登録必須。

[サポート | SendGrid【日本公式サイト】](https://support.sendgrid.kke.co.jp/hc/ja/articles/203029309-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9-%E9%9A%9C%E5%AE%B3%E6%83%85%E5%A0%B1-%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E6%83%85%E5%A0%B1%E3%81%AA%E3%81%A9%E3%81%AF%E5%85%AC%E9%96%8B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B-)