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などのノーコードツールを使って同じことができそうです。今度試してみようと思います。