blastengineのVBA SDKを使って一括配信メール（CSVアップロード）のエラーを受け取る

[blastengine（ブラストエンジン）](https://blastengine.jp/)はシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先へ届けられます。

現在、[VBA向けのblastengine SDK](https://github.com/blastengineMania/blastengine-vba)を開発しています。Excelを利用していますが、Accessなどでも使えるはずです。この記事では、その使い方を解説します。今回は一回の宛先数が50通を超える場合の一括配信メールの送信方法を解説します。

## ユーザ登録する

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/ece1bb6d-4f02-aba3-4197-9c9826ce3f29.png)

## 送信元ドメインの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は リリースページでマクロ付きExcelファイルをダウンロードする](https://github.com/blastengineMania/blastengine-vba/releases)か、リポジトリの内容をvbacでコンパイルしてください。

[blastengineMania/blastengine-vba: blastengineのVBA SDKです](https://github.com/blastengineMania/blastengine-vba)

## 参照設定について

VBAエディタで、ツール > 参照設定 から、以下の参照設定を追加してください。

- Microsoft ActiveX Data Objects 6.1 Library
- Microsoft XML, v6.0

※ 将来的には、参照設定を不要にする予定です。

## 初期化

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

```vb
Dim client As new Blastengine
client.ApiKey = "YOUR_API_KEY"
client.UserId = "YOUR_USER_NAME"
```

## バルクオブジェクトの作成

メールを一括配信する際にはバルクオブジェクトを使います。

```vb
Dim Bulk As Bulk
Set Bulk = client.Bulk
```

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

続けて、バルクオブジェクトに必要なオブジェクトをセットします。

```vb
Bulk.From "info@example.com", "Admin" ' 2つ目の引数（名前）は省略可能
Bulk.Subject = "テストメール"
Bulk.TextPart = "これはテストメールです to __name__"

' 以下は任意
Bulk.HtmlPart = "<h1>これはテストメールです to __name__</h1>" ' HTMLメール
' List-Unsubscribeの設定
Dim dicListUnsubscribe As Dictionary
Set dicListUnsubscribe = New Dictionary
dicListUnsubscribe.Add "url", "https://example.com/unsubscribe/__name__" ' 退会URL（任意）
dicListUnsubscribe.Add "mail", "unsubscribe__name__@example.com" ' 退会メールアドレス（任意）
Bulk.ListUnsubscribe = dicListUnsubscribe
```

そして、この内容を一旦保存します。

```vb
If Bulk.Begin then
	' 保存成功
Else
	' 保存失敗
	' Bulk.Error でDirectory型のエラーメッセージ
	Debug.Print JsonConverter.ConvertToJson(Bulk.Error)
End if
```

## 宛先を追加する

次に宛先を追加します。50の宛先を超えると、CSVアップロードになります。今回は50件を超えた場合を想定しています。

```vb
Dim i as Long
Dim InsertCode as new Dictionary
For i = 0 To 50
	InsertCode.Add "name", "User " & i
	Bulk.Email "user" & i & "@example.jp", InsertCode ' InsertCodeはオプションです
Next i
```

宛先を追加したら、インポートします。そして、インポートが完了するまで待ちます。

```vb
If Bulk.Import Then
	' 更新成功
	While Bulk.Job.Finished = False
		Application.Wait (Now + TimeValue("0:00:01"))
	Wend
Else
	' 保存失敗
	' Bulk.Error でDirectory型のエラーメッセージ
End if
```

## エラー発生時

CSVインポートによるエラーが発生した場合には、 `Bulk.Job.IsError` が `True` になります。この場合には、 `Bulk.Job.Error()` でエラー内容を取得できます。

```vb
While Bulk.Job.Finished = False
		Application.Wait (Now + TimeValue("0:00:01"))
Wend

If Bulk.Job.IsError Then
		Debug.Print JsonConverter.ConvertToJson(Bulk.Job.Error)
End If
```

エラー内容は、以下のようになります。エラー結果CSVをDictionary型にした形です。

```vba
{
	"0": {
		"エラーメッセージ": "[email: [atsushi+6@moongift: data is invalid email address.]]",
		"email": "atsushi+6@moongift",
		"__name__": "User 99",
		"__code__": "6"
	}
}
```

## エラーをスキップする

デフォルトではImport実行時に1件でもエラーがあると処理が失敗します。エラーをスキップして処理を続行する場合には、 `Bulk.Import` の引数として `IgnoreErrors:=True` を指定します。

```vb
If Bulk.Import(IgnoreErrors:=True) = False Then
		Debug.Print JsonConverter.ConvertToJson(Bulk.Job.Error())
		Exit Sub
End If
```

## メールを送信する

後は `Send` メソッドでメールを送信します。引数なしで、即送信されます。

```vb
If Bulk.Send Then
	' 送信成功
Else
	' 送信失敗
	' Bulk.Error でDirectory型のエラーメッセージ
End if
```

時間を指定する場合には、Date型を引数として適用します。

```vb
Dim dtDate as Date
dtDate = DateAdd("n", 5, Now) ' 5分後に送信
If Bulk.Send(dtDate) Then
	' 送信成功
Else
	' 送信失敗
	' Bulk.Error でDirectory型のエラーメッセージ
End if
```

送信成功した場合は `Bulk.DeliveryId` に送信IDが入ります。失敗した場合には `Bulk.Error` にエラー情報が入ります。これはエラー内容がDictionary型で入っています。

```vb
Debug.Print JsonConverter.ConvertToJson(Bulk.Error)
```

## コードについて

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

[blastengineMania/blastengine-vba: blastengineのVBA SDKです](https://github.com/blastengineMania/blastengine-vba)

## まとめ

blastengineには他にも即時送信メールを使ったり、ListUnsubscribeヘッダー機能などもあります。これらの機能も随時実装していきますので、ぜひ皆さんのシステム開発に役立ててください。

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