blastengineを使ってVBAでメールを送信する

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

今回はblastengineを使って、VBAでメール送信を行うまでの流れを解説します。Excel VBAなどで使える方法になります。

## ユーザ登録する

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

![getting-started-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/5c6c8cb0-9ad1-0a6d-88fe-e24bc3ee7b17.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/78a4eeb3-4649-149f-8246-44f83d03a0cf.jpeg)


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

![getting-started-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/d21fc4e3-36f0-6f5c-23e3-8c675e16f538.png)

## API経由で配信する

今回はAPIを使ってHTMLメールを配信する流れを紹介します。今回利用したライブラリは以下の通りです。

- [VBA-tools/VBA-Web](https://github.com/VBA-tools/VBA-Web)  
Windows、macOSで使えるHTTPクライアント
- [VBA-tools/VBA-JSON](https://github.com/VBA-tools/VBA-JSON)  
JSONライブラリ
- [Excel VBA で SHA256 #Excel - Qiita](https://qiita.com/nobu-maple/items/ac0094a226e1d7d25ec3)  
SHA256のハッシュを計算する方法
- [【参照設定不要】Base64フォーマットにエンコードする - VBA入門](https://ribbit.konomi.app/vba/base64-encode/)  
Base64エンコードの方法

### ライブラリを読み込む

[VBA-tools/VBA-Web](https://github.com/VBA-tools/VBA-Web) でダウンロードできるVBA-Web - Blank.xlsmをベースに進めます。この中に、 `VBA-JSON` のモジュールファイル、SHA256・Base64の関数を追加しています。

### 必要な変数を取得

ベースになる関数です。 `YOUR_API_USER` と `YOUR_API_KEY` はそれぞれblastengineのユーザIDとAPIキーに置き換えてください。

```vb
Sub SendMailTest()
    Dim ApiUser As String
    Dim ApiKey As String
    Dim DeliveryId As Integer
    
    ApiUser = "YOUR_API_USER"
    ApiKey = "YOUR_API_KEY"
    
    DeliveryId = SendMail(ApiUser, ApiKey)
    Debug.Print DeliveryId
End Sub

Function SendMail(ApiUser As String, ApiKey As String) As Integer
	' この中に処理を記述します
End Function
```

### トークンを生成する

APIリクエストするためのトークンを生成します。手順としては次のとおりです。

1. ユーザIDとAPIキーを連結する
2. SHA256のハッシュを生成する
3. ハッシュを全て小文字にする
4. 3の文字列をBASE64エンコードする

実際のコードで言うと、次のようになります。 `token` がトークンです。それぞれの関数は上記のリンク先を参考にしてください。

```vb
' 認証用トークンの生成
Dim token As String
token = EncodeToBase64(SHA256(ApiUser & ApiKey))
```

### APIリクエストする

では実際にメールを送信します。APIのエンドポイントは `https://app.engn.jp/api/v1/deliveries/transaction` になります。生成したトークンは `Authorization` ヘッダーに適用します。fromのemailやtoなど、メールアドレスは利用するものに書き換えてください。

```vb
' Webクライアント
Dim Client As New WebClient
Client.BaseUrl = "https://app.engn.jp"

' トランザクション用のリクエスト生成
Dim Request As New WebRequest
Request.Resource = "/api/v1/deliveries/transaction"
Request.Method = WebMethod.HttpPost

Dim From As New Dictionary
Dim Body As New Dictionary
From.Add "email", "no-reply@example.com"
From.Add "name", "送信者サンプル"
Body.Add "to", "user@example.jp"
Body.Add "from", From
Body.Add "subject", "テスト件名"
Body.Add "encode", "UTF-8"
Body.Add "text_part", "テスト配信"
Body.Add "html_part", "<!DOCTYPE html><html><header></header><body>sample html</body></html>"
Set Request.Body = Body

' ヘッダー作成
Request.AddHeader "Authorization", "Bearer " & token
Request.AddHeader "Content-Type", "application/json"
' WebHelpers.EnableLogging = True ' デバッグ用

' レスポンスオブジェクト
Dim Response As WebResponse
Set Response = Client.Execute(Request)
' 結果を格納
If Response.StatusCode <> WebStatusCode.Created Then
		Err.Raise 400, "blastengine", Response.Content
End If
' JSONをパース（デフォルトでは失敗するため、VBA-JSONを利用）
Dim Json As Object
Set Json = JsonConverter.ParseJson(Response.Content)
SendMail = CInt(Json("delivery_id"))
```

### 結果

レスポンスは以下のようになっています。これを `VBA-JSON` でパースして、 `delivery_id` を取得しています。

```json
{
	"delivery_id": 9
}
```

## 注意点

デフォルトのSHA256関数はWindowsでしか動作しません。macOSではシェルを使うようにすれば良いのですが、期待した結果が返ってこないため現状はWindowsのみで動作するコードとなっています。

## まとめ

Excel VBAやAccessからメール送信できると、手軽にシステム化が実現できます。また、メールなどにコピペして手作業で送信しているとミスする可能性もありますので、自動化すればミス軽減にもつながります。

VBAからも、ぜひblastengineを使ってみてください。

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