blastengineを使ってターミナルから添付ファイル付きメールを送信する

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

今回はblastengineでAPIを使って、添付ファイル付きメールを送信するまでの流れを順番に解説します。

## ユーザ登録する

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

![getting-started-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/39ab879f-1356-6ea9-e448-bb842d5ceb6c.jpeg)


## APIキーをゲットする

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

![getting-started-6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/9c0c650d-bd6e-dcc0-77fb-979409f2ac8c.jpeg)


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

![getting-started-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/a9d09dd1-a4e2-2033-2d6d-3fa8dfd55cfa.png)


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

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

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

## トークンを生成する

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

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

例えばユーザIDとAPIキーが以下だったとします。

| 項目 | 値 |
|------|------|
| ユーザID | blastengine |
| APIキー | ABCDEFG |

まずユーザIDとAPIキーを連結します。

`blastengineABCDEFG`

この文字列のハッシュ値を取ります。

```
$ echo -n "blastengineABCDEFG" | shasum -a 256
1f0eee8fc120676fc589492f15228efb3d021f0aee4b006efb27c7ee33f5d6c9  -
```

この値をすべて小文字にし、BASE64エンコードします。

```
$ echo -n "1f0eee8fc120676fc589492f15228efb3d021f0aee4b006efb27c7ee33f5d6c9" | base64 
MWYwZWVlOGZjMTIwNjc2ZmM1ODk0OTJmMTUyMjhlZmIzZDAyMWYwYWVlNGIwMDZlZmIyN2M3ZWUzM2Y1ZDZjOQ==
```

この生成された `MWYwZWVlOGZjMTIwNjc2ZmM1ODk0OTJmMTUyMjhlZmIzZDAyMWYwYWVlNGIwMDZlZmIyN2M3ZWUzM2Y1ZDZjOQ==` がトークンになります。

## JSONファイルを用意する

APIにリクエストするためのパラメータを記述したJSONファイルを用意します（今回はファイル名をbase.jsonとしています）。今回は簡単な例として、次の内容になります。JSONキーについては別な記事で解説する予定ですが、おそらく見ればどこに用いられるものなのかはすぐ分かるかと思います。fromのemail、toのメールアドレスは必要なものに書き換えてください。

```json:base.json
{
  "from": {
    "email": "no-reply@example.jp",
    "name": "送信者サンプル"
  },
  "to": "test@example.com",
  "subject": "テスト件名",
  "encode": "ISO-2022-JP",
  "text_part": "テスト配信",
  "html_part": "<!DOCTYPE html><html><header></header><body>sample html</body></html>"
}
```

## リクエストを組み立てる

blastengineの即時配信（トランザクション）用のエンドポイントは以下になります。

```
POST https://app.engn.jp/api/v1/deliveries/transaction
```

トークンとJSONファイルの準備ができたらcurlリクエストを組み立てます。 `YOUR_TOKEN` は前述の方法で生成した文字列に置き換えてください。また、添付ファイルは自由に指定してください。

```
TOKEN=YOUR_TOKEN
curl \
  -H "Authorization: Bearer $TOKEN" \
  -F 'data=@base.json;type=application/json' \
  -F 'file=@attach1.png' \
  -F 'file=@attach2.png' \
https://app.engn.jp/api/v1/deliveries/transaction
```

これで `{"delivery_id":4}` といったレスポンスが返ってくれば完成です。

## 注意点

添付ファイル付きメールを送信する際の注意点は次の通りです。

- 送信情報（dataパラメータ）は必ずJSONファイルにしてください。また、Content-Typeがapplication/jsonになるように指定します。
- 添付ファイルのサイズは1MBまでになります（契約により異なります）。
- 添付ファイルに指定できるファイルの拡張子が決まっています。詳細は[APIドキュメント - 添付ファイルのサイズ制限と種類](https://blastengine.jp/documents/#tag/%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E5%88%B6%E9%99%90%E3%81%A8%E7%A8%AE%E9%A1%9E)を参照してください。たとえばZipファイルは添付できません。
- 添付ファイルはfileパラメータで指定します。複数指定可能です。

## まとめ

blastengineは次の3ステップでメール送信できます。

1. SPFレコードをセットする
2. APIキーをゲットしてトークンを生成する
3. APIを実行する

日本で提供しているサービスだけあって、日本のキャリアやユーザへの到達率も高いのが特徴です。ぜひblastengineをお試しください！

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