開発情報・ナレッジ

投稿者: 株式会社ゴンドラ 2025年8月19日 (火)

一覧表からデータ更新したユーザーにメールを配信する

APIを使用して一覧表からデータ更新時にメールを送信する方法をご紹介します。

概要

一覧表から一括でステータスの更新等を行うことはよくありませんか? 単票と違って一括で更新できるので便利ですよね。 ただ、フォームを使用せず更新するためサンクスメールが使えない落とし穴があります。 即時で送る必要がない場合はシークエンス配信などで対応できそうですが、即時で送りたい場合困りますよね? 本記事は一覧から更新した時に、更新したデータに紐づいたメールアドレスに即時でメールを配信するプログラムです。
デモサイト

※注意点

デモサイトでメールアドレスを更新すると、そのまま値が残ってしまうので

試した後は、sample+1@test.comなど使用されてないメールアドレスに更新してください。

使用する機能一覧

  • ・マイエリア
  • ・一覧表
  • ・Express2配信
  • ・サンプリング配信api

マイエリア、一覧表の作成

通常通りマイエリア、一覧表を作成します。
一覧表はメールアドレス、ステータスを更新できるように設定しています。

Express2配信設定

通常通りExpress配信2の配信設定を作成します。
スタンバイは「STOP」で大丈夫です。
設定後、配信一覧を確認すると「ルールID」が生成されています。
今回はこのルールIDをapiで使用します。

一覧表の更新ボタンを押したタイミングで、選択されたデータのidを取得し、ajax処理を行う

下記ソースを、一覧表の上部に設置してください。
※jqueryを使用しているため,CDNやファイルDLしてカスタムモジュールに設置し読み込みをしてください。
 デモは3.7.1を使用。
更新ボタンを押したタイミングで、チェックされているデータのIDをjsで取得します。
ソースは以下2点変更してください。
1.ajaxのURLは、メール配信用apiの処理が書かれたマイエリアカスタムページの差し替えキーワードを設定
2.ruleIDはExpress2設定時に生成されたルールIDを設定

  <script>
    $(function() {
  // ボタン(#smp-table-update-button)がクリックされた時の処理
  $('#smp-table-update-button').on('click', function() {
    // クリックされたボタン自身を変数に保存し、無効化する
    const $button = $(this);
    // チェックされているチェックボックスの値を取得して配列に変換
    const values = $('input[type="checkbox"]:checked').map(function() {
      return $(this).val();
    }).get();

    // 配列が空(チェックされた項目がない)場合
    if (values.length === 0) {
      alert("チェックされている項目はありません。");
      return;
    }

    // 1. まず、プラットフォームの更新処理を一旦キャンセルする
    event.preventDefault();
    
    // 2. 処理中の二重クリックを防ぐためにボタンを無効化
    $button.prop('disabled', true);
    // AJAX処理
    $.ajax({
      type: 'POST',
      dataType: 'json',
      url: 'メール配信用apiの処理が書かれたマイエリアカスタムページの差し替えキーワード',
      data: {
          sysID: values.join(','),
          ruleID: 'Express2設定時に生成されたruleID'
      }
    }).done(function(response) {
      // PHPからの応答(response.status)に応じてメッセージを分岐
      if (response.status === 'success') {
        alert('メールを送信しました。'); // 例:「送信しました。」
        // 3. メール送信成功後、プラットフォームの更新処理を手動で実行する
        const $form = $('form:eq(1)');
        
        // フォームに「更新ボタンが押された」という情報を追加
        $form.append(
          $('<input>', {
            type: 'hidden',
            name: 'smp-table-submit-button', // ボタンのname属性
            value: '更新' // ボタンのvalue
          })
        );
        
        // 情報を追加した上で、フォームを送信
        $form.submit();
      } else {
        // statusが 'error' または 'exception' の場合
        alert('送信に失敗しました。再度時間を空けて送信してください'); // 例:「送信に失敗しました。」
        $button.prop('disabled', false);
      }

    }).fail(function() {
      // 通信自体に失敗した場合(404, 500エラーなど)
      alert('通信エラーにより送信に失敗しました。再度時間を空けて送信してください。');
      $button.prop('disabled', false);
    })
  });
});

  </script>
    

phpでメール配信api処理

下記ソースを、マイエリアのカスタムページに設置してください。
ここのソースは特に変更箇所はございません。
一覧から「送信先のIDリスト」と「メールの種類を示すルールID」を受け取ります。
受け取った情報を使って、スパイラルAPIにメール送信を命令します。
メール送信の依頼が成功したか失敗したかを、一覧画面から知らせます。

<?php
//<!-- SMP_DYNAMIC_PAGE DISPLAY_ERRORS=ON NAME=list_send_mail.php-->

// JSから送信されたIDとルールIDを取得
$sendAddrs = [];
if (!empty($_POST["sysID"])) {
    $sendAddrs = explode(',', $_POST["sysID"]);
}

$ruleId = null;
if (!empty($_POST["ruleID"])) {
    $ruleId = $_POST["ruleID"];
}

// IDとルールIDの両方が存在する場合のみ処理を実行
if (!empty($sendAddrs) && !empty($ruleId)) {
    try {
        // スパイラルAPIサーバと通信するインスタンスを作成します。
        $api_communicator = $SPIRAL->getSpiralApiCommunicator();
        $api_communicator->setNoSsl();

        // メールを配信するリクエストを作成します。
        $request = new SpiralApiRequest();
        $request->put("rule_id", $ruleId);   // JSから受け取ったルールIDをセット
        $request->put("ids", $sendAddrs);    // JSから受け取ったIDリストをセット
        $response = $api_communicator->request("deliver_express2", "sampling", $request);

        if ($response->isSuccess()) {
            echo json_encode(['status' => 'success']);
        } else {
            echo json_encode(['status' => 'error', 'error_code' => $response->getErrorCode()]);
        }
    } catch (Exception $e) {
        echo json_encode(['status' => 'exception', 'error_message' => $e->getMessage()]);
    }
} else {
    // 必要なデータが送信されなかった場合のJSON応答
    echo json_encode(['status' => 'error', 'message' => '送信対象のIDまたはルールIDが指定されていません。']);
}
?>
      

応用編

選択されたステータスによってメール配信の有無を判定することもできます。
今回はステータスが「承認」に変更したユーザーにメール配信してみます。

<script>
$(function() {
  // ボタン(#smp-table-update-button)がクリックされた時の処理
  $('#smp-table-update-button').on('click', function() {
    const $button = $(this);
    const $checkedBoxes = $('input[type="checkbox"]:checked');
    const values3 = [];

    if ($checkedBoxes.length === 0) {
      alert("チェックされている項目はありません。");
      return;
    }

    // チェックされた各項目をループして、ステータス3のIDのみを抽出
    $checkedBoxes.each(function() {
      const rowId = $(this).val();
       //セレクトのname値に設定する
      const selectName = `smp-uf-f014372233-${rowId}`;
      const statusValue = $(`select[name="${selectName}"]`).val();

      if (statusValue === '3') {
        values3.push(rowId);
      }
    });

    // ステータス3の項目が1つも選択されていなかった場合
    if (values3.length === 0) {
      alert("送信対象(ステータスが「承認」)の項目が選択されていないので、メール配信は行われません。");
      return;
    }else{
    // --- ここからがメール送信を伴う場合の処理 ---

    // 1. まず、プラットフォームの更新処理を一旦キャンセルする
    event.preventDefault();
    
    // 2. 処理中の二重クリックを防ぐためにボタンを無効化
    $button.prop('disabled', true);
      // AJAX処理
      $.ajax({
        type: 'POST',
        dataType: 'json',
        url: 'メール配信用apiの処理が書かれたマイエリアカスタムページの差し替えキーワード',
        data: {
            sysID: values.join(','),
            ruleID: 'Express2設定時に生成されたruleID'
        }
      }).done(function(response) {
        // PHPからの応答(response.status)に応じてメッセージを分岐
        if (response.status === 'success') {
          alert("メールを送信しました"); // 例:「送信しました。」
          // 3. メール送信成功後、プラットフォームの更新処理を手動で実行する
          const $form = $('form:eq(1)');
        
          // フォームに「更新ボタンが押された」という情報を追加
          $form.append(
          $('<input>', {
              type: 'hidden',
              name: 'smp-table-submit-button', // ボタンのname属性
              value: '更新' // ボタンのvalue
          })
         );   
        // 情報を追加した上で、フォームを送信
        $form.submit();
        } else {
          // statusが 'error' または 'exception' の場合
          alert('送信に失敗しました。再度更新してください'); // 例:「送信に失敗しました。」
          $button.prop('disabled', false);
        }
      }).fail(function() {
        alert("通信エラーにより送信に失敗しました。再度更新してください。");
        $button.prop('disabled', false);
      });
    }
  });
});
</script>
      

セレクトのname値を設定し、選択された値をvalues3に格納することで「承認」を選択したユーザーのみ配信が可能です。

これにて実装完了です。ご自身のSPIRAL環境に貼り付けてメール配信をお試しください。

参考記事:選んだ人だけにメール配信(PHP)

解決しない場合はこちら コンテンツに関しての
要望はこちら