Notionで作った宛先リストにメールを一斉送信する方法(Java編)
- 2022年10月27日
- by 菊田 洋一
- Category: 技術ネタ

「Notion」は、ドキュメントの作成からプロジェクト・スケジュールの管理まで幅広い機能を備えた情報共有ツールです。提供されているAPIを使うことでNotionのデータにアクセスできるので、Twilio SendGridと連携することも可能です。
今回のブログでは、Notionで作った宛先リストを利用してSendGridからメールを一斉送信する方法を紹介します。プログラムの実装はJavaを例にしていますが、他の言語でも同様のことができると思います。

作成の流れ
次の4つの手順で作成していきます。
- Notionのページで宛先リストを作る
- Notion APIを使う準備をする(Notion Integrationの作成)
- SendGrid APIを使う準備をする(APIキーの作成)
- プログラムを実装する
NotionとSendGridのアカウントをお持ちでない方はあらかじめ作成をお願いします。SendGridのアカウントはこちらのボタンから作成できます。

1. Notionのページで宛先リストを作る
宛先リストは「テーブル」を使って作成します。

メールアドレスと名前を並べただけのシンプルな宛先リストです。

2. Notion Integrationの作成
Notion APIを使う準備を進めます。My integrationsにアクセスして「New integration」ボタンを押してください。

Name(名称)は「NotionSendGrid」にして下図のように設定します。
「Submit」を押して次に進むとトークンが表示されます。このトークンは後ほどプログラムを作成する際に利用するので値をコピーしておいてください。

宛先リストのページに戻って、メニューの「Add connections」から先ほど入力したIntegration名の「NotionSendGrid」を選んでください。これでNotion APIの準備は完了です。

3.SendGridのAPIキー作成
続いてSendGridのAPIを使う準備を進めます。ダッシュボードのSettings > API Keysを開いてAPIキーを作成してください。今回作るプログラムではメールの送信権限のみあれば十分なので「API Key Permissions」は「Restricted Access」を選択し、APIキー名を入力します。「Mail Send」のアクセス権限を「Full Access」にしたらAPIキーの準備は完了です。発行されたAPIキーは後ほどプログラムで使うので値をコピーしておいてください。

4.プログラムの準備
ライブラリ
今回のプログラムでは次の2つのJavaライブラリを使いました。
Notionのページは下図のような内部構成になっています。

ページのデータはURLに表示されているPageIDを使って取得します。ページ内のあらゆるコンポーネントはBlockという単位で構成されているので、TableのBlock、さらにその中のTableRowという行相当のBlockからメールアドレスと名前を取得します。
環境変数
NotionのトークンとSendGridのAPIキー、PageIDは.envファイルに環境変数として定義します。dotenv-javaを使って次の.envファイルを用意します。
NTOKEN=secret_xxxxxxxxxx SGKEY=SG.xxxxxxxxxx PAGEID=xxxxxxxxxxx
コード
プログラムはこちらに置きました。前述のとおりTable内のTableRow単位にループを回してメールアドレスと名前を取得したら、SendGridのPersonalizationに設定します。
Dotenv env = Dotenv.load();
try (NotionClient client = new NotionClient(env.get("NTOKEN"))) {
//メールの基本情報
Mail msg = new Mail();
msg.setSubject("nameさん宛てのメールです");
msg.setFrom(new Email("from@example.com"));
msg.addContent(new Content("text/plain", "name さん こんにちは。"));
//ページからTable Blockを取得
Blocks pageBlocks = client.retrieveBlockChildren(env.get("PAGEID"), null, 0);
TableBlock table = pageBlocks.getResults().get(0).asTable();
Blocks rows = client.retrieveBlockChildren(table.getId(), null, 0);
//Table BlockからTableRow Blockを取得して処理
rows.getResults().stream().forEach(r -> {
TableRowBlock tbr = r.asTableRow();
Personalization p = new Personalization();
for(int i=0; i < tbr.getTableRow().getCells().size(); i++) {
List<RichText> list = tbr.getTableRow().getCells().get(i);
if(i%2==0) {
p.addTo(new Email(list.get(0).getPlainText()));
} else {
p.addSubstitution("name", list.get(0).getPlainText());
}
}
msg.addPersonalization(p);
});
あとはmail/sendで一斉送信するだけです。これで、宛先メールアドレスに応じた名前を本文に差し込んだメールを送れます。
//送信処理
SendGrid sg = new SendGrid(env.get("SGKEY"));
Request req = new Request();
req.setMethod(Method.POST);
req.setEndpoint("mail/send");
req.setBody(msg.build());
Response resp = sg.api(req);
…
実際に受信したメールはこんな感じです。


おわりに
今回のブログではNotionで作った宛先リストをSendGridと連携する方法をご紹介しました。連携はJavaのプログラムで実装しましたが、Zapierなどのノーコードツールを使って同じことができそうです。今度試してみようと思います。



