Notionで作った宛先リストにメールを一斉送信する方法(Java編)

Notionで作った宛先リストにメールを一斉送信する方法(Java編)

Notion」は、ドキュメントの作成からプロジェクト・スケジュールの管理まで幅広い機能を備えた情報共有ツールです。提供されているAPIを使うことでNotionのデータにアクセスできるので、Twilio SendGridと連携することも可能です。

今回のブログでは、Notionで作った宛先リストを利用してSendGridからメールを一斉送信する方法を紹介します。プログラムの実装はJavaを例にしていますが、他の言語でも同様のことができると思います。

Notionで作った宛先リストを利用してSendGridからメールを一斉送信する方法

作成の流れ

次の4つの手順で作成していきます。

  1. Notionのページで宛先リストを作る
  2. Notion APIを使う準備をする(Notion Integrationの作成)
  3. SendGrid APIを使う準備をする(APIキーの作成)
  4. プログラムを実装する

NotionとSendGridのアカウントをお持ちでない方はあらかじめ作成をお願いします。SendGridのアカウントはこちらのボタンから作成できます。

無料ではじめる

1. Notionのページで宛先リストを作る

宛先リストは「テーブル」を使って作成します。

「テーブル」を使って宛先リストを作成

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

宛先リスト

2. Notion Integrationの作成

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

My integrationsにアクセスして「New integration」ボタンを押す

Name(名称)は「NotionSendGrid」にして下図のように設定します。

Name(名称)は「NotionSendGrid」にする

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

「Submit」を押して次に進むとトークンが表示される

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

メニューの「Add connections」からIntegration名の「NotionSendGrid」を選択

3.SendGridのAPIキー作成

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

SendGridのAPIキー作成

4.プログラムの準備

ライブラリ

今回のプログラムでは次の2つのJavaライブラリを使いました。

Notionのページは下図のような内部構成になっています。

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);
…

実際に受信したメールはこんな感じです。

実際に受信したメール1
実際に受信したメール2

おわりに

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

アーカイブ

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。