わが社のSMS活用事例と5分でできる配信トライアル

この記事は [ウェブクルーAdvent Calendar 2017](https://qiita.com/advent-calendar/2017/webcrew)の3日目の記事です。
昨日は、@hahegawaさんの[「OpenCVをJava+Tomcatで使ってみた」](https://qiita.com/hahegawa/private/9dbe09c2c44b60f36cfc) でした。

# はじめに
3日めは @wc_moriyama が担当いたします。宜しくお願いします。

わが社のサービスでは、SMS（ショートメッセージサービス）の配信をサービスの一環として利用しています。そのSMSについて、社内外からお問い合わせいただくことが多いので、配信方法や、その効果、気をつけなければいけないことなどをまとめまして、SMSの配信をすぐに試すことができる方法を最後に掲載したいと思います。

# SMSの活用に至った経緯
なぜSMSを利用するようになったかというと、
ユーザ様が我々のサービス利用時に配信しているご案内メールへの反応が期待通りとはいっていませんでした。おそらく多方面からのメールの中に埋もれて気づかれていないのではないか、という仮説のもと、少しでも多くのユーザ様にご覧いただくようにすることが目的で、SMSの配信を開始しました。

SMSを配信するには、SMS対応している携帯端末から手動で配信することができますが、システムと連携させてSMSを送るには、SMSのゲートウェイサービスが提供しているAPIを利用することが一般的です。
インターネットを介して送受信されるEメールとは違い、SMSは電話の音声通話回線が用いられますので、ゲートウェイサービスを利用するか、もしくは、携帯端末をモデムとしてサーバと接続し、そのモデムを操作できるATコマンドからSMSを配信する方法、のいずれかになります。が、後者はあまり一般的な方法ではなく、我々のようなインターネット事業者のほとんどは、ゲートウェイサービスを活用しています。

# SMSゲートウェイサービスの選び方
SMSゲートウェイサービスは、たくさんあります。
一例ですが、
・Twilio　https://twilio.kddi-web.com/
・空電プッシュ　https://www.karaden.jp/karadenpush/
・Nexmo　https://www.nexmo.com/jp
・EzSMS　https://www.ezsms.biz/ja/
など。

これらは、SMSを送るサービスには違いはありませんが、料金体系や、1通で送ることができる文字数、オプションで提供される機能にも差があるので、色々比較して検討されることをおすすめします。選ぶポイントとなるところとしては3点あると考えます。
　1) 料金体系
　2) 受信側での発信者の表記
　3) 1通で送ることができる文字数
　

#### 1) 料金体系
1通あたりの配信料はもちろん、初期費用や月額の固定費、オプションなど、各社様々です。安いところで1通10円を切るところがありますが、10～30円となっているサービスが多いです。
初期費用や月額の固定費も様々で、0円から数万円という差があり、海外の回線からSMSを配信するサービスや、オプションサービスのラインアップがシンプルなサービスが、安い傾向にあります。
　

#### 2) 受信側での発信者の表記
受信者側で、発信者がどのように表記されるかがとても重要と考えます。
スマホであれば、SMSクライアントアプリが入っていて、必ずメッセージとともに、発信者が表示されます。電話番号であったり、電話番号ではない数字の羅列であったり、英字が表示されることもありますが、これはゲートウェイサービスの仕様と、受信側のキャリアによって表記が変わるので、どのような仕様で配信できるかを確認する必要があります。
例えば、見覚えのない番号が表記されていると、受信側はそのメッセージを見ることを控えるかもしれませんし、海外回線からのＳMSは受信拒否設定の条件に入る場合もあるため、受信側への影響はよく考えておく必要があります。
　
#### 3) 1通で送ることが出来る文字数
Eメールとは違い、SMSはメッセージの文字数がかなり少ないです。
全角70文字（半角140文字）がMAXという基本仕様も多く、伝えられるメッセージはかなり限定的になります。そのため、SMSの使用用途としては、多くの情報を伝えるメルマガのような用途には向かず、ユーザ認証や、リマインド機能としての用途が適していると言えます。アクセスしてほしいURLをメッセージに入れると、それだけで制限文字数を超えてしまう可能性もあります。使用する言葉や、URLで占める文字数を工夫する必要があります。また、メッセージ内にURLが含まれていると、受信拒否設定の条件に入ることもあるため、これについても知っておく必要があります。

70文字以上を送ることができる仕様のサービスもありますが、結局は70文字に分割して複数配信していることもあり、1通に対して分割した通数分が課金されるであったり、受信側の端末によっては、分割配信されたメッセージが上下逆になって受信されてしまったりすることもあるため、メッセージの内容もそれに対応できるものでないと、受信側が混乱する可能性があるので、注意が必要です。

# 配信効果
我々が配信を始めてからの効果ですが、結論としては、良い効果が出ました。
SMSはメールに比べて到達率は非常に高い（90％以上とも言われている）ことが理由の第一にあげられます。
我々の利用用途としては、サービス利用時にユーザ様へご案内メールを送り、メール本文に掲載したURLへのアクセスを誘導するものでしたが、それをSMSでも配信したところ、アクセス数が 25～30％程増加しました。

特徴としては、スマホでのサービス利用者の反応の早さです。SMSに反応された8割以上のユーザ様がSMSを配信してから5分以内の反応という結果でした。Eメールに比べて、反応率の良さに加えて、反応の早さも結果として出ており、スマホとの親和性の高さを証明する内容でもありますし、ユーザ様とのコミュニケーション手段としては優れていると言えます。
　
# 注意が必要な点
一方でSMS配信をサービスで運用するにあたっては、注意する必要もあります。

まずは、利用規約に同意いただいたユーザ様にSMSを配信することです。また、停止を希望するユーザ様には、その後の配信機会ではSMSを配信しないな仕様をシステムに盛り込むなどの対応が必須となります。

また、受信側からすると、誰から送られてきているのかよく分からない、というケースがあります。SMSの場合はありがちなケースですが、これについては、SMSサービスゲートウェイの選び方ポイント2)で書きました通り、発信者の表示が、どこか海外の電話番号や、一見意味のなさない数字の羅列で表示さていることが原因です。この意味のない番号というのは、回線経路の識別番号のようなもののようです。
対策として、ゲートウェイサービスの仕様上可能な限り、発信側の電話番号を表示するなど、発信元を特定できる表記をすることが大切だと考えます。

ユーザ様から受信時にお金がかかるのでは、というお問合せをいただくこともありますが、受信者側では通信料は発生しません。電話回線ですので、パケット通信の対象外です。



# 5分でできるSMS配信トライアル
前述で紹介したSMSゲートウェイサービスのいくつかでは、無料でトライアルが出来ますので、今回は Nexmo で無料トライアルの方法を紹介します。
Nexmo は、英国で創業されたサービスで、2017年には日本にも法人ができたそうです。
Python3系が動作する環境があれば、5分で試すことができます。

できあがりイメージはこちら！
このトライアルのケースだと、発信者は「NexmoTrial」と表記できています。

![sms.png](https://qiita-image-store.s3.amazonaws.com/0/181293/318e6ece-0c0a-7da1-2924-5ebf8e50eee5.png)


### トライアル用のアカウント作成
ここでアクセスして、「TRY IT FREE」から無料のアカウントを作ります。
https://www.nexmo.com/products/sms/build

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181293/46471059-9c26-ef4a-5421-f5a5531b670a.png)

　

必要な情報を入力して、サインアップします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181293/10cb259b-eb55-f816-99b2-b38e57e7fb0f.png)
　
サインアップ時に入力した電話番号宛に送られてきた認証コードを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181293/a8c75382-8ef6-b1a2-8bc2-5af1ce435830.png)

　
APIキー（左） と SECRETキー（右） が発行されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181293/37f990b2-f0dc-7960-2967-4477287ed47b.png)

この2つのキーを使って、Nexmoの提供するSMS配信用のRestAPIを利用することでSMSを配信することができます。
記載のとおり、2ユーロ分をトライアルで使用できます（SMS配信であれば1通0.07ユーロ）。

順調でしたら、ここまでで2分くらいでしょうか。
ゆっくり進めてまいりましょう。
　

### 配信処理のサンプルコード
Python3.6.3 で CentOS上で動かしてみました。
※urllibライブラリはPython2系の場合、仕様が違うので注意が必要

```nexmo_trial.py
import urllib.parse,urllib.request

params = {
    'api_key': 'abcde123',
    'api_secret': '*************',
    'to': '819012345678',
    'from': 'Nexmo Trial',
    'text': 'ネクスモ配信トライアル',
    'type': 'unicode'
}

url = 'https://rest.nexmo.com/sms/json?' + urllib.parse.urlencode(params)

request = urllib.request.Request(url)
request.add_header('Accept', 'application/json')
response = urllib.request.urlopen(request)

print(response.read())

```
※api_key と api_secretは発行されたものを記述します

urllib は pythonの標準ライブラリで、指定したURLへアクセスする関数やクラスが定義されています。
urlopen関数で指定したrequestオブジェクトのURLへアクセスすることができます。URLのパラメータに、APIキー、シークレットキー、宛先の電話番号（日本は81、電話番号の最初の0は除く。サンプルコードの場合、090-1234-5678 への配信を想定している）、受信側に発信元として通知する文字列、メッセージ内容、文字コードを指定するという、シンプルなAPIです。

最後にレスポンスを出力していますが、下記のようなレスポンスが返ってきます。

```
$ python nexmo_trial_1.py

b'{"message-count": "1",
    "messages": [{
        "to": "819012345678",
        "message-id": "xxxxxxxxxxxxxxx",
        "status": "0",
        "remaining-balance": "1.79000000",
        "message-price": "0.07000000",
        "network": "44010"
    }]
}'
```
status が "０" となっていれば正常に配信が完了しており、それ以外の場合は、何かしらのエラーとなっている可能性があります（たとえば、パラメータが不正、APIキーが違う、残高不足など）。
　

Nexmoがライブラリを公開しているので、それを活用すると、さらにシンプルなコードになります。
まずは、pip コマンドで、ライブラリをインストールします。

```
$ pip install nexmo

$ pip show nexmo
Name: nexmo
Version: 2.0.0
Summary: Nexmo Client Library for Python
Home-page: http://github.com/Nexmo/nexmo-python
Author: Tim Craft
Author-email: mail@timcraft.com
License: MIT
Location: /usr/local/python/lib/python3.4/site-packages
Requires: requests, PyJWT
```
 
nexmo のライブラリを使用した場合のコードです。

```nexmo_trial_2.py
import nexmo

client = nexmo.Client(key='abcde123', secret='*************')

response = client.send_message({'from':'Nexmo Trial', 
                                'to':'818012345678',
                                'text':'配信トライアル',
                                'type': 'unicode'})

response = response['messages'][0]
print(response)
```
※api_key と api_secretは発行されたものを記述します

これを実行すると、下記のようなレスポンスを得ることができ、正常完了（status が 0）していることが確認できます。

```
$ python nexmo_trial_2.py

{'message-id': 'xxxxxxxxxxxxxxx', 
 'to': '818012345678', 
 'remaining-balance': '1.79000000', 
 'status': '0',
 'network': '44020',
 'message-price': '0.07000000'}
```




# さいごに
エンジニアはランナーに例えられることが多いですよね。
12月は慌しい季節ですが、走るにはいい季節です。
ありがとうございました。

明日は、@sankaku_q さんです。よろしくお願いします。

![IMG_1784.JPG](https://qiita-image-store.s3.amazonaws.com/0/181293/8a6ea186-a266-3dcc-c377-e8ac301962b3.jpeg)

 

ウェブクルーでは一緒に働いていただける方を随時募集しております。
お気軽にエントリーくださいませ。

[開発エンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000005)
[フロントエンドエンジニアの募集](http://www.webcrew.co.jp/recruit/creative.html)
[データベースエンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000023)