レビュー

無料で使用できるワークフロー自動化ツール「n8n」でリマインドメール登録を自動化してみた


GIGAZINEでは定期的に寄付キャンペーンを行っていますが、「寄付をしたいけれども今はちょっと時間がない」という方のために、メールアドレスを登録するとリマインドメールを送信する仕組みを用意しています。リマインドメールの送信にはlistmonkを利用しており、APIが公開されているため外部からメールアドレスの登録ができます。ただlistmonk APIは、いわゆるUPSERTに対応していません。そこで、「メールアドレスが未登録なら登録、登録済みなら更新」という処理を無料かつオープンソースなワークフロー自動化ツールn8nに任せ、複雑なコーディングをせずにUPSERT対応しました。

まず、listmonkを使用する上で必要となる概念を簡単に説明しておきます。
加入者(Subscriber):メール送信の対象者
リスト(List):加入者にどのようなメールを送信するかを示すラベルのようなもの、今回の場合は「リマインドメール」となる

今回利用するAPIは3つあります。1つ目は指定されたメールアドレスを、加入者として追加するAPIです。

POST /api/subscribers

2つ目は登録されている加入者の情報を取得するAPIです。

GET /api/subscribers

3つ目は登録されている加入者にリストを追加するAPIです。

PUT /api/subscribers/lists

冒頭に述べた「UPSERTに対応していない」件についてもう少し詳しく述べると、「POST /api/subscribers」のパラメータに既存のメールアドレスを指定すると、"HTTP 409 Conflict"が返されエラーとなります。一方、APIを利用する立場からは、指定したメールアドレスを持つ加入者が既にいるなら、その加入者に「リマインドメールの送信対象」というリストを追加してほしいところ。よって、望ましい処理をするには、以下のいずれかの手順を踏む必要があります。

1. まず加入者の情報を取得し、既存なら加入者にリストを追加、そうでなければ加入者の追加を行う
2. まず加入者の追加を行い、エラーとなった場合は加入者の情報を取得し、加入者にリストを追加する

前者は必ずAPIを2回呼ぶ必要があります。対して後者は加入者が未登録ならAPIの呼び出しは1回で済み、登録済みなら3回必要になります。なるべくAPIの呼び出しは少ないほうがいい、という見地から考えるといずれも一長一短ではあるものの、リマインドメールの場合はおそらく加入者が既存であるのはレアケースだろうと想定し、後者を採用します。

結果、このようなワークフローとなりました。


以下、ワークフローの各ノードで何をやっているのかを説明します。

◆Webhookノード
ワークフローをウェブAPI形式で呼び出されたら、このノードで受けます。パラメータとして「メールアドレス」を受け取ります。


◆Code (配列値設定1) ノード
ここはちょっとしたハックです。POST /api/subscribersは加入者のリストについて、リストIDの配列値を渡す必要があります。しかしながら、普通にHTTP Requestノードでパラメータに配列値を渡そうとした場合、例えば「[1, 2, 3]」という配列値を渡そうとしても、"[1, 2, 3]"という文字列として解釈してしまいます。そのため、配列値を正しく配列値として渡すために、JavaScriptのコードで設定してやる必要があります。また、JSON値についても同様にここで設定しています。


◆変数設定ノード
n8nワークフロー内で使用可能な変数を設定しています。ただし、前述の理由により配列値とJSON値は対象外です。


◆HTTP Request (加入者追加) ノード
加入者を追加するAPIを呼び出しています。


◆IFノード
条件の真偽によって次に遷移するノードを選択します。設定してある条件は「加入者を追加するAPIが返したHTTPステータスが"HTTP 409 Conflict"以外かどうか」です。


◆Respond to Webhook (加入者追加) ノード
IFノードの条件が真の場合の遷移先です。加入者を追加するAPIからのレスポンスを、Webhookの呼び出し元に返します。


◆Mergeノード
IFノードの条件が偽の場合の遷移先です。IFノードからの入力ルートは「Input 1」であり、それとは別に変数設定ノードからの入力ルート「Input 2」があります。このノードの設定内容は「両方の入力ルートから入力を受けたら、Input 2からの入力をそのまま出力する」です。つまり、Input 1からの入力はトリガーに過ぎないというわけ。


◆HTTP Request (加入者検索) ノード
加入者の情報を取得するAPIを呼び出しています。


◆Code (配列値設定2) ノード
前述のCode (配列値設定1) ノードと同様の処理を行っています。呼び出すAPIのパラメータに違いがあるため、改めて設定しています。


◆HTTP Request (加入者リスト追加) ノード
加入者にリストを追加するAPIを呼び出しています。


◆Respond to Webhook (加入者リスト追加) ノード
加入者にリストを追加するAPIからのレスポンスを、Webhookの呼び出し元に返します。


このようにして、リマインドメールの登録処理は実装されています。GIGAZINEのサーバー運営は大変な状況が続いているので、支援していただける方は是非、「GIGAZINEについて」のページからご寄付をお願いします。

GIGAZINEについて
https://gigazine.net/news/about/


今すぐ寄付するのではなくリマインドメールの登録を行う場合は、少し下にスクロールするとフッターが表示されるので、「いいえ、後で時間があれば」ボタンをクリックしてください。


メールアドレスを入力するポップアップが表示されますので、ご入力の上、「送信」ボタンをクリックしてください。

この記事のタイトルとURLをコピーする

・関連記事
「SwitchBot ハブ3」を用いてサーバー室の空調を自動管理してみた - GIGAZINE

IFTTTのように異なるアプリ同士を連携させるサービス「n8n」が約90億円の資金調達に成功、AI対応に転換して収益が5倍に - GIGAZINE

無料でIFTTTやZapierのようにいろいろなアプリを組み合わせて自動化できるオープンソース&セルフホスト可能なツール「Activepieces」を使ってGIGAZINEの記事全文RSSをメール送信してみた - GIGAZINE

IFTTTやZapierのように複数アプリを連携して自動化できる「n8n」で「RSSで取得したウェブサイトのタイトル&URLをGoogle スプレッドシートに出力する」というワークフローを組んでみた - GIGAZINE

無料でIFTTTやZapierっぽく全自動連携できる「n8n」を自サーバー上に構築してみた - GIGAZINE

in ソフトウェア,   レビュー, Posted by log1c_sh

You can read the machine translated English article I tried automating reminder email regist….