kintoneからのメール送信をGmail APIからSendGrid API経由に移行した時の注意事項まとめ

これは[kintone Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kintone)の12/24担当の記事です。
本来ならば事前に記事書いて当日の朝公開されるべきなのですが、、時間が全くとれず翌日の公開になってしまいました。反省。。

## 背景
### 今までのメール運用
去年の[アドベントカレンダーQiita](https://qiita.com/taketakekaho/items/a35f2ba7254680420a2a
)で概要を書きましたが、私が所属するパブリテック事業部では、契約情報管理含む基幹システムを現在はkintoneで管理しています。そのため、以下のような案内をkintone内で管理しているメールアドレスや顧客情報を元にしてメールを送る必要があります。

- トライアルご案内やお知らせ、通知
- 各サービス導入説明や研修のご案内メール
- サービスメンテナンス通知
- 障害発生時の報告や通知
- ライセンス証書送付
- 販売パートナーへの見積書、注文請書などの送付

オペレーションの効率化と誤送信防止のため極力人の手を介さずに運用を行うためにトヨクモ社が提供しているkMailerを契約してGmail API経由でメールを送信できるようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/3717f084-0a26-9424-f7a8-6cf212a0588f.png)

作業者は、kintoneの詳細画面からメール作成し、メールテンプレートを選択して確認画面で送信ボタンをクリックするだけでメールを送信することができるため、宛先誤り防止やメール作成効率化が実現できました。
また、ステータス変更やフィールド値変更などのトリガで裏側でメールを自動送信することもできるため本当に人間がメール本文をチェックして送信すべきもの以外は自動送信する運用にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/7984d540-3a90-dd2b-57a2-b58e74dfb435.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/c4f8d729-e5f1-a86f-94d5-58843f5255b6.png)


### なぜ移行することにしたか
事業立ち上げから3年程度は上記の運用だけで全く問題なかったのですが。以下の課題が出てきました。

- 契約数が増えてきてGmailの送信上限件数（[2,000通/日](https://support.google.com/a/answer/166852?hl=ja)）を超過してしまう日が発生
- 一斉送信を実行したとしても内部では1件ずつメールを送信する仕組みであるため約2,000件のメール送信に100分以上かかってしまい障害通知など即時性が必要となる通知には向かない

LoGoチャットとLoGoフォームの契約団体数すべてにメール一斉送信するだけでも2,000通上限を超過することになってきてしまったため障害や緊急の通知など1日に何度も一斉送信が必要となった場合にはkintoneからCSV出力して別のメール配信ツールから一斉送信する...などの運用が発生してきてしまいました。これではオペレーションが煩雑になり誤送信などのリスクが増えるため、Gmail APIではない別の方式への移行が必要ということでSendGridで検証することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/c4b26274-e8c6-cd1c-b966-347a3f914535.png)

### SendGridとは？なぜSendGridか
SendGridはメール配信サービスです。以前はSendGrid社が運営するサービスでしたが、Twilio社に買収されサービスの正式名称は「Twilio SendGrid」になっているようです。SendGridの正規代理店である構造計画研究所さんのブログがわかりやすいです。
[SendGridとは？](https://sendgrid.kke.co.jp/about/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/81b24194-091e-c4bb-cdfe-de01072db96e.png)

メール配信ツールはたくさんありますが、その中でも以下の理由でSendGridを採用しました。
- kMailer公式のブログにいくつか情報があり実績あるツールである
- 他事業本部でSendGridを使っている情報があったため技術情報共有して知見を溜められそう
- （個人的にかもしれないですが）SendGridは昔から知っておりメール配信ツールとしての運用実績が長く信頼できた
- API中心での利用であるため画面操作性などは優先度が低く、機能としてはどれもあまり大差ないので正直どれでもよかった
- 構造計画研究所さんのブログやAPI仕様書など技術情報が豊富にあり扱いやすい

## 移行前の設定
### 移行前のSendGridの設定での注意事項
色々調べたり検証した中で注意する点を記載します。

#### プラン契約
これは設定というより契約なんですが。企業として実用するなら絶対有料のProプラン以上にした方がよいと思います。無料プランでもメール送信はできるのですが、Proプランでしか利用できない固定IP利用やサブユーザ機能は安全に確実にデータを管理しメールを相手に届けるために必要な設定だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/d96f1427-ce45-ea25-46e0-3b55bb93d495.png)

#### 確実に相手にメールを届けるための対策
##### 固定IP設定
Pro以上のプランだと固定IPが割り当てられますのでそれを送信元のアドレスに紐づけて設定します。設定方法は[こちら](https://support.sendgrid.kke.co.jp/hc/ja/articles/204784635-%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E9%80%81%E4%BF%A1%E5%85%83IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84-)参照

##### ブロックリストの宛先調査運用を検討
SendGridには、様々な配信停止や配信エラーがリストアップされる仕組みがあります。詳細は[こちら](https://sendgrid.kke.co.jp/docs/Tutorials/C_Manage_Events/using_activity.html)のドキュメント参照

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/f5b79848-0ad5-b350-ce43-e5fae418f38e.png)

SendGridが自動で配信停止リストに登録して今後同じアドレスには送信されない状態にしてくれるものから、リスト化されるけど今後も送信自体はされるものがあり、せっかくリスト化されても放置したままにすると通知が届かないなどのクレームやレピュテーションが下がる要因になってしまいますので実際の運用に合わせてリストからの解除や配信停止への追加などオペレーションを検討する必要があるかと思います。

- Bounces： メールアドレス誤りなど恒久的な配信エラーでSendGridで自動的に登録されるリスト（ハードバウンス）
- Deferred： 一時的な配信エラー（ソフトバウンス）
- Blocks： ソフトバウンスしたためSendGrid側で再送を試みたが、一定時間経っても宛先サーバが受け付けなかった。不明なドメインのメールアドレスなど。登録されてもメールは送信される。
- Spam Reports： 受信者からの迷惑メール報告
- Unsubscribes、Group Unsubscribes、Group Resubscribes： 配信停止または配信停止の解除。

今回移行したメールは重要な契約情報関連の通知や障害報告などのメールに利用するものであるため、定期的にリスト内のアドレスを調査して対応を検討する運用にしています。


##### 送信ドメイン認証（独自ドメイン設定-SPF/DKIM設定）
システムとしてはSendGridからメールを送信しますが、独自ドメイン利用設定を行うことによって、受信者には "所有の独自ドメインから直接メールが送られてきた" ように見せることができます。これをドメイン認証といいますが、今回の送信元となるコーポレートドメインをドメイン認証することで信頼度を上げています。
設定方法は[こちら](https://sendgrid.kke.co.jp/docs/Tutorials/D_Improve_Deliverability/using_whitelabel.html)のDomain Authentication設定参照です。

これは独自ドメイン認証設定前にメール送信した場合の受信側であるGmailからなりすましメールとして迷惑メール判定されている例の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/dde20a83-97fe-96b7-a7be-1113940b45af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/1f3ee6ab-06e2-bbeb-c39c-88101089f49a.png)

独自ドメイン認証設定を行うと「sendgrid.net経由」という文言が消えてコーポレートドメインが認証したものであることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/e0055d95-3f9e-3b62-ca00-5f28383dd5ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/c5e014cb-0ee1-db69-dd87-a02fd32d7e52.png)

##### 送信ドメイン認証（独自ドメイン設定-IPアドレス逆引き設定）
IPアドレス→ドメインという登録だけでなく、IPアドレス→ドメインという方向でもドメイン設定を行っておくことで信頼性および到達率の向上ができます。設定方法は[こちら](https://sendgrid.kke.co.jp/docs/Tutorials/D_Improve_Deliverability/using_whitelabel.html)のReverse DNS設定参照です。

##### IPウォームアップ
宛先サーバから見た「メールの送信元IPアドレスの信頼度（＝レピュテーション）」を上げ、送信者としての信頼を獲得するための作業です。[こちら](https://sendgrid.kke.co.jp/blog/?p=15531)参照。
今回の移行時には、ちょうど必ずしも同日にメールが届かなくてもよい一斉送信内容であった「年末年始の休業のお知らせ」メールを5日間かけて少しずつ50通→100通→500通→1,000通→2,000通に分けてメール送信することでIPウォームアップを行いました。
切替えが簡単にできるため既存の運用に影響することなく簡単にウォームアップができます。

## 移行時の設定
### kintoneの設定
設定変更は不要です。kMailerが間に入っているため、kintone側のオペレーションも設定も何も変更することなく移行ができます。

### SendGridの設定
#### SendGrid APIキーの発行
設定方法は[こちら](https://guide.kintoneapp.com/kmailer/setting_sendgrid/)の項番2から5です。トヨクモさんのブログでは詳細書いてないですが、項番4の権限は最小権限に設定した方がよいのと、項番5のAPIキーが表示されるのは初回の1回のみになるため必ずどこかにメモしておき安全な所でデータ保管した方がよいことに注意です。

#### 二要素認証設定
SendGrid APIを利用するにはSendGridを二要素認証設定しておかないと利用できないようなので必ず設定が必要です。[トヨクモさんのブログ](https://guide.kintoneapp.com/kmailer/sendgrid_auth/)ではSMSテキストでの設定になっていましたが、SMSにはかなりタイムラグがあり数分以上経って忘れた頃に発行されていたりと面倒だったので私は二要素認証アプリAuthy Appでの認証で利用しています。

### kMailerの設定
#### SendGrid APIへの切り替え
kMailerの管理画面でメールサーバの設定メニューを開き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/5aff5a7d-da12-8207-cfac-4ccd48ed6ab1.png)

SMTPサーバ設定を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/44d23ec5-fa43-ad05-dfb1-37ae3f8bf8b5.png)

トヨクモさんの[こちら](https://toyokumo-blog.kintoneapp.com/kmailer_with_sendgrid/)のブログだと情報が古い？のか、ユーザ名が自分のものと記載があるんですがユーザ名はSendGridを利用する場合には必ず「apikey」になるようですので注意です。[こちら](https://guide.kintoneapp.com/kmailer/setting_sendgrid/)のヘルプ手順の内容が正しいです。パスワードはSendGrid APIキーを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/88657aa4-7846-ba60-a397-168ff2bad8ca.png)

## 検証に使ったツール類
検証のためレピュテーションを図るツールをいくつか使いました。
- [Newsletters spam test](https://www.mail-tester.com/)
- [SenderScore.org](https://senderscore.org/assess/get-your-score/)
- [BarracudaCentral](https://www.barracudacentral.org/lookups)
- [Google Postmaster Tools](https://support.google.com/mail/answer/9981691?hl=ja)
- [Microsoft SNDS](https://sendersupport.olc.protection.outlook.com/snds/)
- [Trend Micro Email Reputation Services](https://www.ers.trendmicro.com/reputations)
- [Network Tools: DNS,IP,Email](https://mxtoolbox.com/SuperTool.aspx)

この中でも検証してみたオススメはNewsletters spam testです。各項目ごとでスコアリングされるのでどこが悪いのかがわかりやすいです。セキュリティ設定する前は如実にレピュテーションスコアが悪く、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/34c9ecb5-c777-9229-4a28-27ca6f442bdf.png)

設定後には改善していることがわかりやすかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/a0d7aba4-e591-ccca-c969-8d77a0a399e1.png)


## 移行してみて
移行してから1か月程度経った時点での所感は以下です。

- 操作者の操作に変更がなかったためスムーズに混乱なく移行ができた
- 2,000件のメールが数分で送信完了になるのは気持ちいい
- レピュテーションが99%以上で維持できている。IPウォームアップちゃんとしてよかったのかも。
- SendGridのActivityログは7日間しか保存されないため、webhookトリガでAWS Lambda > S3 に保存し、Athenaで参照できる仕組みなど検討中
- SendGridの構造計画研究所さんの技術サポート心強い
- メールって...奥が深い...


## 参考リンク
- [社内にメールサーバ不要！SendGridとkMailerを連携してみる](https://toyokumo-blog.kintoneapp.com/kmailer_with_sendgrid/)
- [SendGridの二要素認証の設定方法](https://guide.kintoneapp.com/kmailer/sendgrid_auth/)
- [二要素認証設定をしたSendGridとkMailerの連携方法](https://guide.kintoneapp.com/kmailer/setting_sendgrid/)
- [SendGridプランと機能一覧](https://sendgrid.kke.co.jp/functions/)
- [SendGridからメール送信する場合のSPFとDKIMの認証の仕組み – 前編](https://sendgrid.kke.co.jp/blog/?p=10883)
- [SPF, DKIMの特徴と違い](https://sendgrid.kke.co.jp/blog/?p=10121)