Google Apps Scriptでblastengineを使ってメール送信を行う（添付ファイル付きメール）

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

今回は今開発中のGoogle Apps Script用SDK（以下GAS SDK）を使って添付ファイル付きのメール送信を行う方法を紹介します。

## コードについて

GAS SDKはMIT Licenseのオープンソース・ソフトウェアです。リポジトリは以下にあります。

[blastengineMania/blastengine-gas: Google Apps Script向けのblastengine SDKです](https://github.com/blastengineMania/blastengine-gas)

## ユーザ登録する

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)

## ライブラリIDについて

GASのライブラリIDは `1GvJKygDvrhoq9w1FIRepBo1kAB3yo1LucHtL6CIM-KqmaFaxLUbyBdim` になります。こちらをGoogle Apps Scriptのエディタにて、ライブラリとして登録してください。

```
1GvJKygDvrhoq9w1FIRepBo1kAB3yo1LucHtL6CIM-KqmaFaxLUbyBdim
```

![blastengine-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e7bd1386-9893-0d80-226c-d130eb912a1b.jpeg)


今回はIDを `Blastengine` として解説します。変更している場合はそれぞれ読み替えてください。

## 初回実行時の注意

初回実行時には外部URL（blastengineのAPI）にアクセスを許可するダイアログが出ます。なお、この時に以下のような怖いダイアログが出ます。

![blastengine-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/a57beb3b-5ab8-1ca1-a612-97124ce248fb.jpeg)


これはインストール数が増えると消えるらしいのですが、まだ作成したばかりのため表示されてしまうようです。左下にある詳細というリンクから許諾を続行できます。

## 初期化

先ほど取得したユーザー名とAPIキーを使って初期化します。

```js
Blastengine.init('YOUR_USER_NAME', 'YOUR_API_KEY');
```

## メールオブジェクトの用意

blastengineでは即時配信されるトランザクションメールと、一括配信のバルクメールがあります。執筆時点（2022年4月現在）では、SDKはトランザクションメールのみ対応してます。

```js
const transaction = Blastengine.transaction();
```

## 配信元、配信先を設定

件名や宛先などをセットします。

```js
transaction.fromEmail = 'info@example.com';
transaction.setTo('user@example.jp');
transaction.subject = 'Test subject';
transaction.setText('Test body');
```

## 添付ファイルを追加する

添付ファイルは `addAttachment` メソッドを使います。Blobをセットすれば良いので、リソースはリモートやGoogle Driveどちらでも使えます。

```js
// Google Drive
const file = DriveApp.getFileById('DRIVE_FILE_ID');
transaction.addAttachment(file.getBlob());
// リモート
const response = UrlFetchApp.fetch('https://example.com/logo.jpg');
transaction.addAttachment(response.getBlob());
```

## 送信する

送信を実行します。GASなのでネットワーク処理は同期になります。

```js
const res = transaction.send();
```

結果の `res` には、デリバリーIDが入ってきます。このIDを使って配信状況を確認できます。

```js
console.log(res);
// { delivery_id: 188 }
```

## Tips

blastengineのAPIでは、fileパラメータに複数ファイルを添付してAPI呼び出しを行います。GASのUrlFetchAppはパラメータをJSONオブジェクトで渡すので、1つのキーに対して複数パラメータを設定できません。配列は使えませんでした。

そこで[Google Apps Scriptを使ってmultipart/form-dataタイプでHTTPリクエストする - Qiita](https://qiita.com/tanaike/items/02feac3ab75e9c79594d)で作成されているFetchAppを試したのですが、こちらも複数指定はできませんでした。そのためFetchAppを参考にして、独自でboundaryを生成しています。

[この辺りのコード](https://github.com/blastengineMania/blastengine-gas/blob/main/src/libs/delivery/transaction/base.ts#L75)なのですが、コツはpayloadに適用するバイト文字列は1次元の配列になっている必要があります。バイト文字列の生成は `Utilities.newBlob` で任意の文字列からBlobを生成して、 getBytes メソッドで取得するのが一番手軽です。

テキストファイルであればバイト文字列化は不要ですが、画像などのバイナリファイルを multipart/form-data で送信する際には必須になります。あまりないとは思いますが、GASでmultipart/form-data送信を自作する場合には参考にしてください。

## まとめ

GAS SDKを使えばスプレッドシートからメールを一括配信したり、Googleフォームから個人ではないFromを使って返信できます。Gmailでは1日の配信件数に限界がありますが、blastengineを使えばそういった心配は無用です。

ぜひblastengineをお試しください！

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