ジョブ(メール送信)

最終更新日: 2021年3月7日

サンプルアプリケーション「顧客管理」

顧客へ定期的に(例 毎月一回)メールマガジンを送信する、という機能を実現します。

今回のサンプルアプリケーションには3つのモデル「顧客」「可・不可フラグ」「結果フラグ」が含まれます。

顧客

シンプルな顧客モデルを用意しました。各項目は次の用途があります。

名称説明
ID整数主キー項目です。自動採番としています。
名前文字列メール文中にプレースホルダでこの名前を埋め込むことができます。
メールアドレス文字列お客様のメールアドレスです。この値がセットされていない場合、メールを送信することはできません。
メール送信可・不可モデル参照メール送信を行えるかどうか、という状態を持たせます。
メール送信結果モデル参照直前に行ったメール送信が成功したかどうか、という状態を持たせます。
最終メール送信日時日付時間直前に行ったメール送信が成功した日付時刻を持たせます。
顧客モデル項目

可・不可フラグは次のようにしました。

ID説明
1
2不可
可・不可フラグ

結果フラグは次のようにしました。

ID説明
1成功
2失敗
結果フラグ

ジョブを用意する

「顧客メルマガ」というジョブを用意します。「スクリプト」タブ内の「ジョブ」を開きます。

ジョブの作成(1)

ギアアイコンから「新規」作成を行います。

ジョブの作成(2)

スクリプト名と概要を入力します。

スクリプト名と概要を入力する

「編集」ボタンをクリックすると、ジョブを作成するダイアログが開きます。

ブロックでジョブを作成する

メール送信ジョブの作成

今回、次のようなルールとします。

  • すべての顧客を対象として、
  • 「メール送信可・不可」状態が "1" (可)の顧客で、
  • かつ「一度もメール送信したことがない」か、「最後にお送りしてから7日を超えている」方を対象に、
  • メールを送信し、
  • メール送信が成功したら「メール送信結果」を "1" (成功) としつつ「最終メール送信日時」に現在時刻をセットする。
  • メール送信に失敗したら「メール送信結果」を "2" (失敗) とする。

変数「メール送信日時」

はじめに、メール送信日時を保持する変数を用意しておきます。「変数」ブロック群から「変数の作成...」を行います。

変数の作成(1)

「メール送信日時」という変数が用意されました。

変数の作成(2)

変数「メール送信日時」に現在時刻をセットするブロックを用意します。

はじめに、ワークスペースに(作成した)変数を配置します。

ワークスペースに変数を配置する

「文」ブロック群から、「〜に〜をセット」ブロックを配置します。

値をセットするブロック(1)
値をセットするブロック(2)

現在時刻を表すWagby関数 NOW を使います。

NOW関数

変数「メール送信日時」に「現在時刻(NOW)」をセットするブロックができました。

NOW関数(2)

メール送信ブロックの使い方

「ジョブ」ブロック群から「モデル〜のデータでメールを送信する」ブロックを選択します。

メール送信ブロックには次の設定が必要です。

設定欄説明
メールテンプレートID どのメールテンプレートIDを使うか、を指定します。実際にメール送信ジョブを行う前に、このIDをもった「メールテンプレート」を事前に準備しておいてください。メールテンプレートIDを決める手順は「システムの管理>メールテンプレート」をお読みください。
起動条件 条件に合致した場合のみメール送信を行うという制御ができます。
成功時のアクション メール送信に成功した場合の処理を記述できます。対象データの値を変更することができます。また、複数のブロックを並べることもできます。
失敗時のアクション メール送信に失敗した場合の処理を記述できます。対象データの値を変更することができます。また、複数のブロックを並べることもできます。
待ち時間 (ms) 最大送信回数の分だけメールを送信後、次のメール送信処理を再開するまでの待ち時間を指定します。単位はミリ秒です。3000と指定すると3秒待ちます。未指定時は待たない(連続送信)となります。
最大送信回数 一度に送るメールの数を指定します。送信回数が指定した数を超えた場合、上記「待ち時間」だけ処理を中断したあと、送信処理を再開します。未指定時は制限なし、となります。
ジョブで利用できるメール送信ブロック

ワンポイント

このブロックは指定したモデルのすべてのデータを対象にします。例えば1万件のデータがあった場合、1万回処理されます。

このように1件ずつデータを処理するブロックを「スクローラ (Scroller)」と呼ぶことがあります。スクローラは一度の大量のメモリを消費しないように設計されています。

ワンポイント

一度に大量のメールを送信しようとすると、メールサーバが「スパムメール」と判断し、送信処理を強制的に停止することがあります。

「最大送信回数」と「待ち時間」を適切に設定することで、スパムメール判定を回避できる場合があります。

「メール送信日時」変数を用意したブロックと、メール送信ブロックをつなげます。つなげることで順番に実行されるようになります。(この例では初めに変数を用意し、次にメール送信ブロックを実行するようになります。)

2つのブロックをつなげる

メール送信対象モデルを「顧客」と指定します。

メール送信対象モデルの指定

メール送信ブロックの、その他のパラメータを設定していきます。

メールテンプレートIDの指定

今回はメールテンプレートIDを固定値 "magazine" としています。

このジョブを実行する前に、メールテンプレートID "magazine" を用意しておいてください。これはビルド後のアプリケーションで、システム管理者が行う作業です。

はじめに「文字列」ブロック群から、固定文字列を示すブロックを選択し、ワークスペースに配置します。

文字列ブロック群

固定文字列を表現するブロックを配置します。

メールテンプレートIDの指定(1)

"magazine" と指定します。

メールテンプレートIDの指定(2)

成功時のアクション

メール送信が成功した時に行う処理を記述できます。未設定の場合は、何もしません。

今回はメール送信が成功したら「メール送信結果」を "1" (成功) としつつ「最終メール送信日時」に現在時刻をセットしてみましょう。

はじめに「文」ブロック群から「〜に〜をセット」ブロックを選択します。

セット用ブロック(1)

「成功時のアクション」に配置します。

セット用ブロック(2)

「顧客」モデルの「メール送信結果」項目に、数値の "1" をセットするブロックを配置します。

成功時のアクションの設定(1)
成功時のアクションの設定(2)
成功時のアクションの設定(3)
成功時のアクションの設定(4)

同じように「顧客」モデルの「最終メール送信日時」項目に、変数「メール送信日時」をセットするブロックを配置します。

成功時のアクションの設定(5)
成功時のアクションの設定(6)
成功時のアクションの設定(7)
成功時のアクションの設定(8)

失敗時のアクション

メール送信が失敗した時に行う処理を記述できます。未設定の場合は、何もしません。

今回はメール送信に失敗したら「メール送信結果」を "2" (失敗) とします。

失敗時のアクションの設定(1)
失敗時のアクションの設定(2)

待ち時間

ここでは固定値として、数値 "3000" をセットします。(3000ミリ秒、すなわち3秒、となります。)

待ち時間の設定

最大送信回数

ここでは固定値として、数値 "3" をセットします。上の「待ち時間」の設定と組み合わせて、3通送信するごとに3秒待つ、という動作になります。

最大送信回数の設定

起動条件

起動条件は「条件判断ブロック群」の、判断ブロックを使います。

判断を行うブロック

起動条件に配置してみました。条件自体は空白のままとなっています。(これから設定していきます。)

起動条件部にブロックを配置する

はじめに「顧客のメール送信可・不可項目の値が "1" なら」という起動条件をブロックで表現してみます。

モデル群のブロックから「顧客」を選びます。

モデル群ブロック

対象項目を「メール送信可・不可」とします。

対象項目を選ぶ

条件を満たす値 "1" を設定します。

条件値の設定

複雑な条件を設定する

次に「顧客のメール送信可・不可項目の値が "1" で、かつ、最終メール送信日時が空(まだ送信したことがない)」という起動条件に変えてみましょう。

条件判断ブロック群から「〜かつ〜」という接続用のブロックを選びます。

接続ブロック

いったんワークスペースに仮配置します。

ワークスペースへの配置

最初に設定した起動条件ブロックを、今回の接続ブロックの左側に再配置します。

最初の条件の再配置

もう一つの条件「最終メール送信日時が空」をブロックで表現します。「空」を判定する関数 ISBLANK は文字列版と日付版があります。今回は日付版を使います。

文字列版ISBLANK (今回は使わない)
日付版ISBLANK (今回、使う)

接続ブロックの右側に配置します。

接続ブロックへの配置

ワークスペースを縮小表示した例です。

拡大や縮小の操作によって、ブロックの挙動が変わることはありません。
ワークスペースの縮小表示

さらに「最後にお送りしてから7日を超えている」という条件も含めてみます。条件判断ブロック群から、同じ接続ブロックを使いますが、今度は「または」を使います。

接続ブロックの追加

「または」を示す接続ブロックに、ISBLANKの条件ブロックを再配置します。

条件ブロックの再配置

もう一つの条件「〜を超えている」を表現するブロックを配置します。

条件ブロックの配置

条件「>」を指定します。

条件の指定

二つの日付の差を取得するWagby関数DATEDIFを使います。

DATEDIF関数(1)
DATEDIF関数(2)

7日、を表現するため、数値ブロック群から固定数値を表現するブロックを配置します。

数値を表現するブロックの配置

二つの日付を数字として比較できるよう、Wagby関数TODATEを使います。

TODATE関数(1)

DATEDIF関数の最初に「最終メール送信日時(を数字で表現した値)」をセットします。

TODATE関数(2)

現在日付は変数でもっていました。これもTODATE関数で数値にします。

TODATE関数(3)

DATEDIF関数の二番目に配置します。全体が「または」という条件で接続されています。これによって「一度もメール送信したことがない、または、最後にお送りしてから7日を超えている」を表現できました。

一度もメール送信したことがない、または、最後にお送りしてから7日を超えている

全体を見渡すため、ワークスペースの表示をもう一段階、縮小表示させてみます。

ワークスペースの縮小表示

すべての条件を結合したブロックとします。

すべての条件を一つのブロックに統合する

最後に、この条件ブロックをメール送信の「起動条件」にセットします。

起動条件の設定

保存

作成したスクリプトを保存します。 これでジョブの準備が完了しました。

ジョブを実行する

実行時間を指定することができます。または「今すぐ実行」を行うこともできます。

仕様・制約

スパムメール対策

一度に大量のメールを送信すると、メールサーバからスパムメールと判定され、送信処理がブロックされることがあります。この対策として、Wagbyの初期値では1日のメール送信数の上限を500件まで、としています。

これはGoogle社が運営するGmailが1日500通を超えるメールを送信するとエラーと扱うルールに準拠しています。[2022.3時点のGmailルール]

大量メール配信の実現

Amazon SES を使った大量メール配信を使うことができます。メール送信数の上限を設定でき、かつ高速なメール配信を実現します。