Node.jsでSMSをバッチで送信


このポストで簡単なSMSバッチ送信方法を紹介したいと思います。

最近SMS送信できるAPIが増えてきていると思いますが、大体1通ずつの送信になっています。APIを提供されている会社の中、Vonageという会社があります。VonageのSMS APIも1通ずつの送信になっていますが、バッチ送信のサンプルコードも提供しています。このサンプルを使ってみようと思っています。https://github.com/nexmo-se/simple-sms-blaster

このサンプルはNode.jsで書かれていて、マイクロサービスとしてデプロイするのは簡単にできると思います。このSMSバッチ送信サービスにCSVをPOSTしたら、VonageのSMS APIをコールしてSMSを送信します。

SMSバッチ送信を試しましょう

事前に準備するもの

サンプルのSMSバッチ送信サービスを用意

1)コードをCloneします。

git clone https://github.com/nexmo-se/simple-sms-blaster.git
cd simple-sms-blaster

2)パッケージをインストールします。

npm install

3)コンフィグファイルを作ります。

cp .env.example .env

テキストエディターでパラメーターを設定します。少なくともAPI_KEYとAPI_SECRETを設定する必要があります。

.env
# Nexmo SMS API Endpoint
API_URL=https://rest.nexmo.com/sms/json

# Nexmo API Key
# ここを設定して下さい
API_KEY=key

# Nexmo API Secret
# ここを設定して下さい
API_SECRET=secret

# Sender ID used for sending out SMS
# SMSの送信元 *11文字まで、アルファニューメリック
SENDER_ID=NXSMS

# Text per second. Rate of sending out SMS Request
# マックスの送信レート
TPS=30

# Number of lines to skip when reading CSV. Useful if there are header lines
# ヘッダーがあれば、適切な値にして下さい
CSV_SKIP_LINES=0

4)サーバーをスタートします。

npm start

SMSを送信

5)CSVファイルを準備します。
SMSバッチ送信サービスにアップするCSVを準備します。utf8エンコーディングが期待されると思います。簡単なフォーマットで、2カラムしかないです。ヘッダーも必要ないです。

No. カラム 内容
1 to 送信先の電話番号
2 text SMSの内容

test_20210107.csvというファイルにしています。知らない人にいきなり送信すると良くないので、自分の手元にある電話番号に変えて下さい。

test_20210107.csv(utf8)
819011111111,テストSMSです。

ここでちょっと注意しないといけないのはtoの電話番号がE.164フォーマットで書かないといけないことです。Wikipediaを読んでも分かりにくいと思うので、簡単に言うと、日本の電話番号(090-1111-1111)からスタートして、最初の「0」と「-」を消して、「81」を頭に追加すると、E.164フォーマットになります。電話のプロに聞くと、最初の「0」が国内プレフィックスだからE.164(インターナショナルフォーマット)で使わないです、、、など、、、色々詳しく教えてくれると思いますが、下記の例を見て真似するのは一番早いと思います。

日本の電話番号 E.164
090-1111-1111 819011111111
070-2345-6789 817023456789

6) バッチサービスにPOSTします。
やっとSMSを送信します。「file」というパラメーターとしてPOSTします。

curl -F 'file=@./test_20210107.csv' http://localhost:8080/upload

SMSが届きました。

最後にノートと注意

  • CSVでは送信先の電話番号をE.164で書く。
  • .envの「SENDER_ID」がわりと自由に設定できるが、キャリア(特に海外の場合)のルールがあるので、要注意。
  • .envの「TPS」について、デフォルトだと、30を越えられない。https://help.nexmo.com/hc/en-us/articles/203993598-What-is-the-Throughput-Limit-for-Outbound-SMS-
  • このポストのスコープ外ですが、エンドユーザーに迷惑かけずスパムしたりしないで下さい。

追加

コードを見ると、src/server.jsに「POST /blast」というエンドポイントもあります。実は、さっき「POST /upload」をコールしたんですが、バッチ送信サービスはcsvを読んだ後「POST /blast」を使っているそうです。「For Internal Use」と書いてありますが、適切なjsonを/blastにポストしたら、csvがなくてもSMSの送信はできそうです。ざっと見た感じでは送信先番号とSMSの内容を「records」というパラメーターにArrayとして入れればいけそうな気がします。