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


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

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

![Screen Shot 2021-01-07 at 15.39.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683316/6494598b-1ce4-4454-afb5-6cf28579efc1.png)

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



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

###事前に準備するもの
* Vonage（Nexmo）のAPI Key（[ここから作れます](https://dashboard.nexmo.com/)）＊NexmoがVonageに買収されました。
* git
* npm
* curl


###サンプルのSMSバッチ送信サービスを用意
<b>1）コードをCloneします。</b>

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

```bash
cd simple-sms-blaster
```
<b>2）パッケージをインストールします。</b>

```bash
npm install
```

<b>3）コンフィグファイルを作ります。</b>

```bash
cp .env.example .env
```

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

```config:.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
```

<b>4）サーバーをスタートします。</b>

```bash
npm start
```

###SMSを送信

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

|No. | カラム | 内容
|:-----------|:------------|:------------|
| 1       | <b>to</b> | 送信先の電話番号        | 
| 2     | <b>text</b> | SMSの内容      | 

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

```text:test_20210107.csv（utf8）
819011111111,テストSMSです。
```

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

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


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

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

SMSが届きました。
![IMG_2346.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683316/4db22dbc-ccf6-4374-04fa-8b2a7451a92c.png)



#最後にノートと注意

* 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-](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として入れればいけそうな気がします。