
GIGAZINEでは定期的に寄付キャンペーンを行っていますが、「寄付したいけど今は時間がない」という方のために、メールアドレスを登録するとリマインドメールが届く仕組みになっています。リマインダーメールを送信するにはリストモンク私たちが使用しているのはAPI公開されているため、外部からでもメールアドレスを登録できます。 listmonk API を呼び出すだけです動揺はサポートされていません。そこで、「メールアドレスが未登録の場合は登録し、登録済みの場合は更新する」という処理を行える、無料のオープンソースのワークフロー自動化ツールを作成しました。n8n複雑なコーディングを行わずに UPSERT をサポートできました。
まず、listmonk を使用するために必要な概念を簡単に説明します。
・購読者:メール送信者の対象
・リスト: 購読者にどのようなメールが送信されるかを示すラベルのようなもの。この場合は「リマインダーメール」になります。
今回使用するAPIは3つです。 1 つ目は、指定された電子メール アドレスを購読者として追加する API です。
POST /api/subscribers
2 つ目は、登録された加入者情報を取得する API です。
GET /api/subscribers
3 番目の API は、登録済みの購読者にリストを追加することです。
PUT /api/subscribers/lists
冒頭で述べた「UPSERT非対応」についてもう少し詳しく説明すると、「POST /api/subscribers」パラメータに既存のメールアドレスを指定すると、「HTTP 409 の競合」というメッセージが返され、エラーとなります。 一方、API を使用する観点からは、指定したメール アドレスを持つ購読者が既に存在する場合、その購読者を「リマインダー メール受信者」のリストに追加したいと考えます。そのため、目的の結果を達成するには、次のいずれかの手順を実行する必要があります。
1. まず、サブスクライバ情報を取得し、すでに存在する場合はリストをサブスクライバに追加し、存在しない場合はサブスクライバを追加します。
2. まずサブスクライバを追加し、エラーが発生した場合は、サブスクライバの情報を取得してリストをサブスクライバに追加します。
前者では API を 2 回呼び出す必要があります。一方、後者では、サブスクライバが登録されていない場合は 1 回の API 呼び出しのみが必要で、サブスクライバが登録されている場合は 3 回の API 呼び出しが必要です。 API呼び出しはできるだけ少ない方が良いという観点からは、どちらも一長一短ですが、リマインダーメールの場合は、既存の購読者がいるケースはおそらく稀だと思われるので、後者を採用することにします。
結果としてはこんな感じのワークフローになりました。
以下では、ワークフロー内の各ノードが何を行うのかについて説明します。
◆Webhookノード
ワークフローが Web API 形式で呼び出される場合、このノードによって受信されます。 「メールアドレス」をパラメータとして受け取ります。
◆コード(配列値設定1)ノード
ここでちょっとしたハックをご紹介します。POST /api/subscribersサブスクライバーのリストの場合は、リスト ID の配列値を渡す必要があります。ただし、通常、たとえば、HTTP リクエスト ノードのパラメータに配列値を渡そうとすると、次のようになります。[1, 2, 3]「」という配列値を渡そうとしても[1, 2, 3]したがって、配列値を配列値として正しく渡すためには、JavaScriptコード内で設定する必要があります。また、ここではJSON値も設定します。
◆変数設定ノード
n8n ワークフロー内で使用できる変数を設定しています。ただし、配列値やJSON値は上記の理由により対象外となります。
◆HTTPリクエスト(サブスクライバ追加)ノード
サブスクライバーを追加するために API を呼び出しています。
◆IFノード
条件の真偽に応じて、遷移先の次のノードを選択します。設定条件は「加入者追加APIが返すHTTPステータスが「HTTP 409 Conflict」以外かどうか」です。
◆Webhookへの応答(追加メンバー) ノード
IFノードの条件が真の場合の遷移先です。 Add Subscriber API からの応答を Webhook 呼び出し元に返します。
◆マージノード
IFノードの条件が偽の場合の遷移先です。 IFノードからの入力ルートが「入力1」であり、変数設定ノードからの入力ルートが「入力2」となります。このノードの設定は「両方の入力ルートから入力を受けた場合、入力2からの入力をそのまま出力する」となっています。つまり、Input 1 からの入力は単なるトリガーです。
◆HTTPリクエスト(加入者検索)ノード
サブスクライバー情報を取得するために API を呼び出しています。
◆コード(配列値設定2)ノード
前述のCode(配列値設定1)ノードと同様の処理を行います。呼び出すAPIのパラメータに違いがあるため再設定しています。
◆HTTPリクエスト(加入者リスト追加)ノード
API を呼び出してサブスクライバーにリストを追加します。
◆Webhookへの応答(加入者リスト追加)ノード
Add Subscriber List API からの応答を Webhook 呼び出し元に返します。
これがリマインダーメールの登録プロセスの実装方法です。 GIGAZINEのサーバー運用は引き続き困難な状況が続いておりますので、ご支援いただける方は「GIGAZINEについて」ページより寄付をお願いいたします。
GIGAZINEについて
https://gigazine.net/news/about/
今すぐ寄付するのではなく、電子メールによるリマインダーに登録したい場合は、少し下にスクロールするとフッターが表示されるので、[いいえ、後で時間があります]ボタンをクリックします。
メールアドレスの入力を求めるポップアップが表示されます。メールアドレスを入力して「送信」ボタンをクリックしてください。
この記事のタイトルとURLをコピーします














