APIを使って添付ファイルを送信する(Node.js編)

メール送信を行うのは一般的にSMTPを使って行います。しかしサーバによってはメール配信プログラムをインストールしていないこともあります。そうした時に使えるのがHTTP経由、APIを使ったメール配信です。Customers Mail CloudはSMTPだけでなく、API経由でのメール配信にも対応しています。

今回はそのメール配信APIを使って添付ファイル付きメールを送信します。

APIサーバについて

APIサーバのエンドポイントURLは契約しているプランによって異なりますのでご注意ください。

プラン名 エンドポイントURL
無料トライアル https://sandbox.smtps.jp/api/v2/emails/send.json
Standardプラン https://te.smtps.jp/api/v2/emails/send.json
Proプラン https://SUBDOMAIN.smtps.jp/api/v2/emails/send.json

SUBDOMAINは、サービス利用開始時に申請いただいたものです

APIユーザを作成する

API設定画面にて、APIユーザを作成します。アクセス権限として、SMTPとHTTP-APIの2つを有効にしてください(メール配信を行うので、SMTP権限が必要になります)。

Node.jsで試す

今回はNode.jsを使って試してみたいと思います。今回のコードはバージョン8.0以降で動きます。

ライブラリを読み込む

APIを利用する際にはHTTPアクセスをします。そこでHTTPアクセスを容易にする superagent というライブラリを読み込みます。

const request = require('superagent');

このライブラリを利用する際にはNode.jsのバージョン管理、npmを使ってあらかじめインストールしておく必要があります。コマンドは npm i superagent で行います。

変数を設定する

そしてAPIサーバのエンドポイントURLを指定します。

const url = 'https://sandbox.smtps.jp/api/v2/emails/send.json';

次にAPIユーザの認証情報を指定します。

const api_user = 'api@smtps.jp';
const api_key = 'PASSWORD';

配信先の情報です。これは複数アドレス、まとめて指定できます。

const to = [{
  name: 'John Doe',
  address: 'example@smtps.jp'
}];

配信元の指定です。

const from = {
  name: 'Customer Cloud Mail Admin',
  address: 'info@smtps.jp'
};

最後にメール配信内容です。どちらも必須の情報です。

const subject = 'テストメール';
const text = `このメールはテストメールです。
改行を入れます。

----
フッターです
`;

変数をまとめる

変数の用意ができたので、一つのパラメータとしてまとめます。

const params = { api_user, api_key, to, from, subject, text };

送信を行う

ではAPIサーバのエンドポイントURLと配信情報のパラメータを使ってメール送信を行います。メール送信APIはPOSTメソッドを使います。添付ファイルを付ける場合には、multipart/form-data を使います。その際には、パラメータをまとめて指定できないので、まずリクエスト情報を取得します。

(async (url, params) => {
  try {
    // 送信処理
    const r = request
      .post(url)
      .set('Content-Type', 'multipart/form-data')
      .accept('application/json')
    // この下に処理を続けます
    
  } catch (e) {
    // エラーの場合
    console.error(e.response.body);
  }
})(url, params);

そして各パラメータをfieldメソッドで追加します。この際、オブジェクト(FromやTo)であればJSON.stringifyを使って文字列にしますが、それ以外のデータは直接指定します。

for (let key in params) {
  if (typeof params[key] === 'object') {
    r.field(key, JSON.stringify(params[key]));
  } else {
    r.field(key, params[key]);
  }
}

そして添付ファイルを追加します。まず添付ファイルの合計数を指定します。

r.field('attachments', 2);

そしてファイルを指定します。ファイルはattachmentN(Nは添付ファイルのインデックス)という名前を使います。最後のファイルを追加した時点で処理が実行され、結果が返ってきます。

r.attach('attachment1', '/path/to/file1')
const result = await r.attach('attachment2', '/path/to/file2')
console.log(result.body);

送信が成功すると、下記のようにメールIDが返ってきます。

{ id: '<1053497219.15567.1558665761030@mta02.sandbox.smtps.jp>' }

きちんと添付ファイルも確認できます。

f:id:moongift:20191125173203p:plain
添付ファイル付きメール

エラーがあると、下記のようにエラー内容が返ってきます。

{
  errors: [ { code: '02-001', field: 'text', message: 'text is required.' } ]
}

まとめ

サーバ上の制限によってSMTPが使えない場合でもHTTP経由でメール配信が行えますので、APIをぜひ使ってみてください。今回はNode.jsを使いましたが、汎用的なHTTPアクセスを行っていますので、他のプログラミング言語でも簡単に実装できるでしょう。

さらに詳しい使い方についてはEmail Sending APIを参照してください。