blastengineのNode.js SDKで一斉配信用メールアドレスをCSVアップロードする

blastengineは開発者にとって使いやすいメール配信サービスを提供しています。まだサービスローンチしたばかりでSDKが不足しているのですが、徐々に開発を進めています。

まず最初にNode.js向けにSDK開発を進めていますが、一斉配信用にメールアドレスをCSVアップロードできるようになりました。この記事ではその使い方を解説します。

[blastengine - npm](https://www.npmjs.com/package/blastengine)

## ユーザ登録する

blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします（ユーザIDは後で使います）。

![getting-started-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/515541ad-b74e-e1e2-ac34-46d181ee2924.jpeg)

## 送信元ドメインのSPFを設定する

送信元として利用するドメイン（自分で持っているもの）の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。

```
txt @ v=spf1 include:spf.besender.jp ~all
```

## APIキーを取得する

ログイン後、管理画面の右上にある設定メニューに移動します。

![getting-started-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/47b2b2ac-2e41-77fe-d84f-0ae0b7541f36.jpeg)


そして設定の中で、APIキーを取得します。

![getting-started-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2b5ca124-3020-1d39-84e4-911cd4db27e2.png)

## 必要な情報について

SDKを使う上で必要なのは、先ほどのAPIキーとユーザIDになります。

## SDKのインストール

SDKは npm コマンドでインストールできます。

```
npm i blastengine
```

## SDKのインポート

まずSDKをインポートします。

```js
import { BlastEngine, Bulk } from 'blastengine';
```

## 初期化

先ほどのAPIキーとユーザIDを使って初期化します。

```js
new BlastEngine(YOUR_USER_ID, YOUR_API_KEY);
```

## 一斉配信オブジェクトを作成する

一斉配信用のオブジェクトを生成します。

```js
const bulk = new Bulk;
```

## 必要な情報をセットする

続けて、一斉配信オブジェクトに必要なオブジェクトをセットします。

```js
bulk
	.setFrom('info@example.com', 'YOUR NAME')
	.setSubject('Test subject')
	.setText('メールの本文');
```

## メール配信内容を登録する

一斉配信内容をblastengineに登録します。

```js
const res = await bulk.register();
```

## 宛先をセットする

次に宛先をセットします。宛先は1件ずつセットもできます。

```js
bulk.setTo('example1@example.com', {key: '__code1__', value: '値'});
bulk.setTo('example2@example.com', {key: '__code1__', value: '値2'});
await bulk.update();
```

### CSVアップロードする

メールアドレスが入ったCSVファイルを用意します。他のカラムは置き換え用キーワードになります。

```csv
email,__prop1__,__prop2__,__prop3__
test@example.jp,テスト,テスト太郎,20200101
sample1@example.com,サンプル,サンプル次郎,20210101
```

このファイルを指定してアップロードを行います。この処理は非同期で登録されるので、まずジョブクラスが返ってきます。

```js
const job = await bulk.import(path.resolve('./tests/mail.csv'));
```

そして処理が完了するのを待ちます。

```js
while (!job.finished()) {
	await job.get();
	await new Promise((resolve) => setTimeout(resolve, 1000));
}
```

ジョブクラスには次のようなプロパティもあります。

```js
class Job {
	// ジョブID
	public id: number;
	// 総処理件数
	public total_count?: number;
	// 処理中の%
  public percentage?: number;
	// 成功した件数
  public success_count?: number;
	// 失敗した件数
  public failed_count?: number;
	// ステータス
  public status?: string;
}
```

##### 失敗レポートダウンロード

インポートに失敗したメールアドレスはレポートをダウンロードできます。エラーがない場合には何も返ってこない（404）なので、あらかじめisErrorでチェックしてください。

```js
if (await job.isError()) {
  // エラーあり
  console.log(job.report); // CSVでエラー内容表示
} else {
  // エラーなし
}
```

## 配信を開始する

後は send メソッドで配信を実行します。配信時には任意の時間を設定できます。デフォルトでは1分後としています。

```js
await bulk.send();
// 一日後の場合
const date = new Date;
date.setDate(date.getDate() + 1);
const res = await bulk.send(date);
```

`res.delivery_id` に数字が入っていれば、送信完了です。

```
res.delivery_id
// => 18
```

### 配信キャンセルする

配信予約した後でキャンセルする（編集状態に戻す）場合には cancel メソッドを使ってください。

```js
await bulk.cancel();
```

### 削除する

一斉配信用のオブジェクトを削除する場合には delete メソッドを使ってください。なお、一斉配信用のオブジェクトは10個までしか作成できません。

```js
await bulk.delete();
```

## コードについて

コードはGitHubにアップしてあります。ライセンスはMIT Licenseになります。

[blastengineMania/blastengine-node](https://github.com/blastengineMania/blastengine-node)

## まとめ

blastengineには他にも一括メール配信を行ったり、添付ファイル付きのメール配信機能などもあります。これらの機能もSDKに随時実装していきますので、ぜひ皆さんのシステム開発に役立ててください。

[エンジニア向けメール配信システム「ブラストエンジン」](https://blastengine.jp/)