【PHP】blastmail APIでメルマガ登録・解除をする

#概要
[blastmail](https://blastmail.jp/)を使ってメールマガジン登録・解除を実装する機会がありました。
そのときの手順やAPIの使い方についてメモです。

#blustmailの準備
[blastmail](https://blastmail.jp/)に会員登録すると、

- 管理画面へのログイン情報
- API key

が発行されます。

blastmailのAPIを利用するために、これらの情報を使うことになります。
API Keyは登録時のメールに記載されています。

また、管理画面の**「契約情報＞アカウント情報」**の最下部でも確認できます。

#APIの連携
APIを使ってメルマガ登録や解除などを行う手順としては、

1. API経由でログインをし、アクセストークンを発行
2. 発行されたアクセストークンをパラメーターに含めてAPIを叩く
3. メルマガへの新規登録やユーザーの登録情報を確認などができる

といった感じです。

**※有料アカウントで独自ドメインなどを設定している場合、APIのURLもそのドメインに変わります。**


[blastmailのAPIリファレンス](https://blastmail.jp/api/)

##ログイン（アクセストークン発行）
[詳しいパラメータはこちら](https://blastmail.jp/api/login_https.html#section1)

まずはblustmailにログインしてアクセストークンを発行します。
ログインはPOSTのみ有効となっており、今回はCurlを使いました。

```login.php
$url = 'https://api.bme.jp/rest/1.0/authenticate/login';
$login_data = [
    'username' => 'ログインID',
    'password' => 'ログインパスワード',
    'api_key' => 'API Key',
    'f' => 'json' // responseをjson形式に指定
];

// curlの設定
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); // 取得するURLを指定
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); // POST送信
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 実行結果を文字列で返す
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($login_data)); // POSTする値
$response = curl_exec($ch); // APIを叩く
$token = json_decode($response, true); // レスポンスをjsonから配列に変換

// ログイン失敗
if (!isset($token['accessToken'])) {
    echo 'ログインに失敗しました';
}

// レスポンス結果（$token）
// {'accessToken':'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'}
```

ログインに成功すれば、accessTokenが返ってきます。

##ログアウト（アクセストークンの破棄）
[詳しいパラメータはこちら](https://blastmail.jp/api/login_xml.html#section2)

ログアウトしてアクセストークンを破棄します。
ログアウトはGETが使えるので、file_get_contents()を使いました。

```logout.php
$url = 'https://api.bme.jp/rest/1.0/authenticate/logout?';
$query = ['access_token' => $token['accessToken']];
$response = file_get_contents($url . http_build_query($query));
```

$responseには0（false）または1（true）が入ります。
ログアウトに成功すればtrueが返ってきます。

#個別登録（新規登録）
メルマガの購読登録を新規で行う場合です。

##項目設定
今回は、新規登録にあたって必要な情報は「メールアドレス」のみとしています。

「項目設定」から登録させる項目を決めることができます。
他にも氏名や電話番号などを登録することも可能です。

![qiita_blast002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655954/67caaef9-a638-de61-d022-ffc7e6eb58e8.png)

登録する項目のパラメーター名は以下で確認できます。
**「テキストメール（メール新規作成）＞差し込みコード」**

メールアドレスの場合は「c15」になります。

![qiita_blast003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655954/0b3242ed-77cb-e753-4026-77537328e571.png)



##実装
[詳しいパラメータはこちら](https://blastmail.jp/api/regist1_https.html#section1)


Curlを使ってPOSTで登録データを送信します。


```regist.php
// $token['accessToken']には、ログインで得た
// アクセストークンが代入されているものとします

$url = 'https://api.bme.jp/rest/1.0/contact/detail/create';
$regist_data = [
    'access_token' => $token['accessToken'],
    'c15' => '登録したいメールアドレス' // 登録したい項目のパラメータ
];

// curlの設定
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($regist_data));
$response= curl_exec($ch);

// 登録失敗
if (!(bool)$response) {
    echo '登録に失敗しました';
}
```

$responseには0（false）または1（true）が入ります。
登録に成功すればtrueが返ってきます。

管理画面の「読者一覧」に登録したユーザーが表示されれば成功です。
![qiita_blast001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655954/1ef1a220-97e1-a49d-ffdf-6d9aec64d210.png)

※ただし、以前に登録していて解除した場合などの、

- 管理画面上にはないメールアドレス
- 登録済みで配信停止中のメールアドレス

はデータベースに情報が残っているからか、新規登録ができませんでした。
そのため、次に説明する配信ステータスの変更を行う必要があります。

　
実装としては登録履歴があるかを調べ、

1. 未登録なら新規登録
2. 登録履歴があれば「配信中」にステータスを変更

のような形で新規登録を実装することになります。
最後にこれらをまとめたソースコードを記載します。

#配信ステータス変更
登録の削除、配信停止などを行う場合はステータスの変更を行います。
変更するには登録者のIDが必要なので、まずはユーザーを検索してIDを取得します。

##個別検索（ユーザー検索）
[詳しいパラメータはこちら](https://blastmail.jp/api/regist1_https.html#section1)

メールアドレスまたはユーザーIDから、登録情報を検索します。

```search.php
// $token['accessToken']には、ログインで得た
// アクセストークンが代入されているものとします

$url = 'https://api.bme.jp/rest/1.0/contact/detail/search?';
$query = [
    'access_token' => $token['accessToken'],
    'email' => 'メールアドレス',
    'f' => 'json'
];
$response = file_get_contents($url . http_build_query($query));
$user = json_decode($response, true);

// ユーザーID
echo $user['contactID'];
```

##個別編集（ステータス変更）
[詳しいパラメータはこちら](https://blastmail.jp/api/regist1_https.html#section3)

検索で取得したユーザーID（contactID）をもとに、ステータスを変更します。

```change.php
// $token['accessToken']には、ログインで得た
// アクセストークンが代入されているものとします

// $user['contactID']には、検索で得た
// ユーザーIDが代入されているものとします

$url = 'https://api.bme.jp/rest/1.0/contact/detail/update';
$change_data = [
    'access_token' => $token['accessToken'],
    'contactID' => $user['contactID'],
    'status' => '配信停止' // 変更後のステータス
];

// curlの設定
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($change_data));
$response= curl_exec($ch);

// 変更失敗
if (!(bool)$response) {
    echo 'ステータスの変更に失敗しました';
}
```

$responseには0（false）または1（true）が入ります。
ログアウトに成功すればtrueが返ってきます。

#登録までの流れをまとめ
メルマガ購読を登録するまでの流れをまとめます。
解除の場合もほぼ同じようなソースで実装ができます。

流れとしては

1. blastmailにログインし、アクセストークンを取得
2. 登録ユーザーのメールアドレスを検索
3. 未登録であれば新規登録
4. 登録済みであればステータスを「配信中」に変更する
5. blastmailからログアウトし、アクセストークンを破棄

のようになっています。

```mailmagazine.php
// blastmailログイン
$url = 'https://api.bme.jp/rest/1.0/authenticate/login';
$login_data = [
    'username' => 'ログインID',
    'password' => 'ログインパスワード',
    'api_key' => 'API Key',
    'f' => 'json' // responseをjson形式に指定
];

// curlの設定
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); // 取得するURLを指定
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); // POST送信
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 実行結果を文字列で返す
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($login_data)); // POSTする値
$response = curl_exec($ch);
$token = json_decode($response, true); // レスポンスをjsonから配列に変換

if (!isset($token['accessToken'])) {
    // ログイン失敗エラー
}

// ユーザー検索
$url = 'https://api.bme.jp/rest/1.0/contact/detail/search?';
$query = [
    'access_token' => $token['accessToken'],
    'email' => '登録したいメールアドレス',
    'f' => 'json'
];
$response = file_get_contents($url . http_build_query($query));
$user = json_decode($response, true);

if (empty($user)) {
    // 未登録の場合は新規登録
    $url = 'https://api.bme.jp/rest/1.0/contact/detail/create';
    $regist_data = [
        'access_token' => $token['accessToken'],
        'c15' => '登録したいメールアドレス'
    ];
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($regist_data));
    $response= curl_exec($ch);
} else {
    // 過去に登録していた場合はステータス変更
    $url = 'https://api.bme.jp/rest/1.0/contact/detail/update';
    $regist_data = [
        'access_token' => $token['accessToken'],
        'contactID' => $user['contactID'],
        'status' => '配信中'
    ];
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($regist_data));
    $response= curl_exec($ch);
}
if (!(bool)$response) {
    // 登録失敗エラー
}

// ログアウト（アクセストークンの破棄）
$url = 'https://api.bme.jp/rest/1.0/authenticate/logout?';
$query = ['access_token' => $token['accessToken'],];
$response = file_get_contents($url . http_build_query($query));

```

##メモ

ステータスを「削除」にすると管理画面からユーザーは削除されるが、論理削除のためおそらくデータベースには残っている。（そのため削除ユーザーも新規登録できないので、ステータス変更を行う必要がある）

　

以上です！