プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

PHPでブラストエンジン(blastengine)からメールを一括送信する③

国内産のメールAPIで送信する案件があったので、紹介します。
今回は、前回一括送信設定に宛先を設定しましたので、それを送信します。

www.pon-x.jp

※SDKもありますが、あえてメソッドをつくりました。

環境

PHP8.2
Laravel10

実装

※以下すべてMailApiController内のメソッドとして書いていきます。

<?php
class MailApiController extends Controller
{
  public function bulk_setting($title, $message){
       
      /// 前々回作ったメソッド
  }

////////////////////////////////////////////////////////////////
//次に、作成したメールに対して送信先を設定します。
////////////////////////////////////////////////////////////////

    public function bulk_update($delivery_id, $users){

       /// 前回作ったメソッド

    }

////////////////////////////////////////////////////////////////
//最後に送信します
////////////////////////////////////////////////////////////////


  public function bulk_send($delivery_id){

    
        $url = "https://app.engn.jp/api/v1/deliveries/bulk/commit/$delivery_id/immediate";
        $user_id="apiuser"; //API接続するユーザーID
        $api_key="apikey"; //API接続するキー
        $str = "$user_id$api_key";
        $token = base64_encode(strtolower(hash('sha256', $str)));//ユーザーIDとキーを使ってTOKENを作成する

        // ヘッダー
        $header = [
            "Content-Type: application/json",
            "Authorization: Bearer $token",
        ];
 

            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            $res = curl_exec($curl);
            curl_close($curl); 
            $json = json_decode($res);

            if (isset($json->delivery_id) && is_int($json->delivery_id)){ //送信成功
                return true;
            }
        
        
        return false;
    }

////////////////////////////////////////////////////////////////
//送信する
////////////////////////////////////////////////////////////////
public function bulk_mail($title, $message, $to){

  $to_chunk50 = array_chunk($to, 50); //50件ずつ送る $toはメールアドレスの配列
  $result = [];
  foreach($to_chunk50 as $users){

      /////メール設定//////
      $delivery_id = self::bulk_start($title, $message);

     /////アドレス設定//////
     if (self::bulk_update($delivery_id, $users)){
         /////メール送信//////
         if (self::bulk_send($delivery_id)){
               $result[] = array_merge($result , $to);
         }

     }
    
  }

  return $result; //成功した送信先をかえす
}

大量に送信する際はrate limitに引っかからないようにこのように一括送信しますが、上限があるのでchunkして送信するとよい。