blastengineはシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先に届くようになります。
今回は今開発中のGoogle Apps Script用SDK(以下GAS SDK)を使って添付ファイル付きのメール送信を行う方法を紹介します。
コードについて
GAS SDKはMIT Licenseのオープンソース・ソフトウェアです。リポジトリは以下にあります。
blastengineMania/blastengine-gas: Google Apps Script向けのblastengine SDKです
ユーザ登録する
blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします(ユーザIDは後で使います)。
送信元ドメインのSPFを設定する
送信元として利用するドメイン(自分で持っているもの)の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。
txt @ v=spf1 include:spf.besender.jp ~all
APIキーを取得する
ログイン後、管理画面の右上にある設定メニューに移動します。
そして設定の中で、APIキーを取得します。
ライブラリIDについて
GASのライブラリIDは 1GvJKygDvrhoq9w1FIRepBo1kAB3yo1LucHtL6CIM-KqmaFaxLUbyBdim
になります。こちらをGoogle Apps Scriptのエディタにて、ライブラリとして登録してください。
1GvJKygDvrhoq9w1FIRepBo1kAB3yo1LucHtL6CIM-KqmaFaxLUbyBdim
今回はIDを Blastengine
として解説します。変更している場合はそれぞれ読み替えてください。
初回実行時の注意
初回実行時には外部URL(blastengineのAPI)にアクセスを許可するダイアログが出ます。なお、この時に以下のような怖いダイアログが出ます。
これはインストール数が増えると消えるらしいのですが、まだ作成したばかりのため表示されてしまうようです。左下にある詳細というリンクから許諾を続行できます。
初期化
先ほど取得したユーザー名とAPIキーを使って初期化します。
Blastengine.init('YOUR_USER_NAME', 'YOUR_API_KEY');
メールオブジェクトの用意
blastengineでは即時配信されるトランザクションメールと、一括配信のバルクメールがあります。執筆時点(2022年4月現在)では、SDKはトランザクションメールのみ対応してます。
const transaction = Blastengine.transaction();
配信元、配信先を設定
件名や宛先などをセットします。
transaction.fromEmail = 'info@example.com';
transaction.setTo('user@example.jp');
transaction.subject = 'Test subject';
transaction.setText('Test body');
添付ファイルを追加する
添付ファイルは addAttachment
メソッドを使います。Blobをセットすれば良いので、リソースはリモートやGoogle Driveどちらでも使えます。
// 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なのでネットワーク処理は同期になります。
const res = transaction.send();
結果の res
には、デリバリーIDが入ってきます。このIDを使って配信状況を確認できます。
console.log(res);
// { delivery_id: 188 }
Tips
blastengineのAPIでは、fileパラメータに複数ファイルを添付してAPI呼び出しを行います。GASのUrlFetchAppはパラメータをJSONオブジェクトで渡すので、1つのキーに対して複数パラメータを設定できません。配列は使えませんでした。
そこでGoogle Apps Scriptを使ってmultipart/form-dataタイプでHTTPリクエストする - Qiitaで作成されているFetchAppを試したのですが、こちらも複数指定はできませんでした。そのためFetchAppを参考にして、独自でboundaryを生成しています。
この辺りのコードなのですが、コツはpayloadに適用するバイト文字列は1次元の配列になっている必要があります。バイト文字列の生成は Utilities.newBlob
で任意の文字列からBlobを生成して、 getBytes メソッドで取得するのが一番手軽です。
テキストファイルであればバイト文字列化は不要ですが、画像などのバイナリファイルを multipart/form-data で送信する際には必須になります。あまりないとは思いますが、GASでmultipart/form-data送信を自作する場合には参考にしてください。
まとめ
GAS SDKを使えばスプレッドシートからメールを一括配信したり、Googleフォームから個人ではないFromを使って返信できます。Gmailでは1日の配信件数に限界がありますが、blastengineを使えばそういった心配は無用です。
ぜひblastengineをお試しください!