PHP
Cloud
SMS
Nexmo

f3: sms 自動転送を考えてみる(模索中)

.
昨今の sns / sms サービスは、ともに
端末依存、sim 依存のモノが多い

sms は sim というよりも 電話回線に紐付くもので
しょうがないといえばしょうがないけど
複数端末運用をしていると、B 端末で確認できない
みたいなことになって不便を感じる

前回記事 [f2: sms - imessage 連携テスト]
https://qiita.com/cxfgp/items/5af80bbdef161a1a519c
の imessage (icloud 転送) のように

確かにローカル端末側での自動転送という方法は
以下のようにいくつかあるけれど
双方の端末を常時オンラインにして、
アプリ常駐したり、
ID の紐付けをしておかないといけなかったり
片方が常時オンラインではない運用 になると、
思うようにいかない

  1. iFTTT(Android SMS) や Auto SMS などのアプリ常駐連携
  2. imessage の icloud 転送
  3. RCS ( +メッセージ 等 ) -> まだ未知数

もっとこう 端末依存せずにメール自動転送のように
気軽に転送してくれるモノはないのかと思い、

sms -> cloud sms -> メール 自動転送 と
メール送信 -> cloud sms -> sms 受信 を
試してみました

[ まとめ ]

  1. sms -> cloud sms -> メール 自動転送 は可能
  2. メール送信 -> cloud sms -> sms 受信 も可能
  3. 環境問題(料金、国際)がクリアにならないと運用はきびしい
  4. 現時点では、企業向けまたは、SMS 認証向けの印象

[ お品書き ]

  1. 買い出し
  2. キッチン
  3. 仕込1 (SMS -> Nexmo -> MAIL)
  4. 仕込2 (MAIL -> Nexmo -> SMS)
  5. 食感
  6. デザート

[ 1. 買い出し ]

候補は以下2つあったけれど

Twilio
https://www.twilio.com/

Nexmo
https://www.nexmo.com/

Twilio は、WEB API が用意されているものの
Programmable SMS という GUI での SMS テスト送信が
うまくいかなかったので
(環境や設定の問題と思います、多分)
Nexmo にしました

Twillio の場合は、
@kidach1 様の

TwilioとRailsで、1通1円のSMS認証を実装してみる
https://qiita.com/kidach1/items/cd63063fa98aaa5030bd

が、わかりやすいです

Nexmo については
Qiita Organization ユーザーでもある WACUL 様の

SMS送信サービスのNexmoを利用する
http://blog.wacul.co.jp/blog/2014/10/07/nexmo/

に、色々概要(+ Node.js)があるのでわかりやすいです

[ 2. キッチン ]

さくらのレンタルサーバ
スタンダード

php 7.2

Nexmo SMS API

[ 3. 仕込 1 (SMS -> Nexmo -> MAIL) ]

・SMS を受信したら メールに 自動転送する

ひとまず番号を取得しました
アメリカの番号です (010-1-XX-XXXX-XXXX)

Nexmo 管理コンソール上で
フックする php の URL を記載します

Webhook URL for Inbound Message
https://xxxx.xxxx/xx/sms-receive.php

ものすごく手っ取り早くするなら
以下でできました

sms-receive.php
#!/usr/local/bin/php

<?php

mb_language("Japanese");
mb_internal_encoding("UTF-8");

$frm20 = $_GET;
$mobile20 = $frm20['msisdn'];

if(isset($mobile20))
{ 

$now20 = date('Y-m-d H:i:s');
$too20 = $frm20['to'];
$message20 = $frm20['text'];
$timestamp20 = $frm20['message-timestamp'];

$name2 = "FROM-CLOUD-SMS: ".$now20;

$text1 = $message20;
$text5 = htmlspecialchars_decode($text1, ENT_NOQUOTES);
$text6 = "\n".$timestamp20."\n\n"."FROM: ".$mobile20."\n\n"."TO: ".$too20."\n\n".$text5."\n\n";

$to = 'RECEIVE@MAILADDRESS';

$subject = $name2;
$message = $text6;
$headers = 'From: FROM@MAILADDRESS' . "\r\n";

 }

?>

※ message-timestamp はアメリカ時間なので、
9時間プラスで想定する必要あり

アメリカの番号 (010-1-XX-XXXX-XXXX) に
SMS を送信すれば、指定のメールアドレスに
内容が受信されます

( この場合は SMS -> Nexmo への国際 SMS 送信料がかかります )
( 後述する送信料に注意! )

[ 4. 仕込 2 (MAIL -> Nexmo -> SMS) ]

・メール送信による 相手への SMS 送信

MAIL -> Nexmo の部分は、

.mailfilter で受信メールを
php に受け渡してパイプ処理します

Nexmo -> SMS の部分は、

Nexmo 管理コンソール上で提供される
・url
・api_key
・api_secret
を用いて

・from (自分の番号)
・to (送信先番号)
・text (本文)

を curl すれば 送信できます

$url = 'https://rest.nexmo.com/sms/json?' . http_build_query([

'api_key' => 'XXXXXXXX',
'api_secret' => 'XXXXXXXXXXXXXXXX',
'to' => '81XXXXXXXXXX',
'from' => '1XXXXXXXXXXXXXX',
'text' => 'HONBUN'

]);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);


php パイプするメールアドレスに
メール送信すれば、
指定した to (送信先番号) に
SMS が届きます

(この場合は Nexmo -> SMS の送信料がかかります)

[ 5. 食感 ]

cloud を使用した メール送受信による
SMS 送受信は上記の通りできました

が、

その他に問題がいくつかあり
実現困難な壁が待っています

(1) SMS 受信時の SMS 送信者名

Nexmo から SMS が送信され、
端末の SMS が受信するのですが、
送信者名が、NXSMS となっています

詳細を見てみると、
+81 6XXXX
となっていました

これはよく言われることですが、
海外の事業者から国内に入ってきたときに
ネットワーク事業者を経由するため、
番号が維持されずに端末に送信される為です

今回は docomo 経由なのですが、
softbank でも au でも発生する可能性はあります

Nexmo にも問い合わせましたが、
日本のネットワーク事業者(いわゆる3大キャリア)
に依存する為、私どもではどうすることもできません
という回答でした

要するに、SMS を送信したい相手に
自分の Nexmo の SMS 番号 を伝えても
その番号では受信がされない為、受信した相手も困惑します

もっとも、自分の Nexmo の SMS 番号も、
国際 SMS 番号になるので、伝える時点で
相手に不信がられます

(2) 送信料

Nexmo から 国内(日本)への送信料金は
2018/10/07 送信時点で 1通 0.07 ユーロ (約9円) でした
(EUR 0.07 = JPY 9.18 -> 2018/10/07 円相場)

もちろん、国内での通常の SMS 送信よりはちょっと高いので
そこも問題ではありますが、それよりも、逆ルート
相手が Nexmo 宛てに SMS を送信するいわゆる国際 SMS の
送信料金が以下で、運用のきびしさを目の当たりにします

docomo 国際 SMS 通信料
https://www.nttdocomo.co.jp/service/world/worldcall/outline_m/sms/
半角160文字、全角70文字まで 送信料:50円/1通

softbank 国際 SMS 通信料
https://www.softbank.jp/mobile/service/global/outgoing/mail/services/
1~70文字(全角の場合) 送信料:100円/1通

au 国際 SMS 通信料
https://www.au.com/mobile/service/global/sms/
半角160文字、全角70文字まで 送信料:100円/1通

・自分 メール -> Nexmo -> SMS -> 相手
= 9円/1通

・相手 -> 国際 SMS -> Nexmo -> メール -> 自分
= 50円 or 100円/1通

今度 SMS の 番号を変えたので、以後はここに送信してね
と、相手に 国際電話番号的な SMS 番号を伝えたとして
相手は 1通送信するごとに、月額の携帯代として
50円または100円が加算され請求されます

(パケット通信料は別として、
送信料という名目がない無料の)
メール か imessage か、
SNS メッセージにして、と言われますよね

(3) 国際 SMS の送信処理時間

iphone の場合ですが、
通常の SMS 送信時間は、数秒といった印象ですが、
Nexmo というか、国際 SMS を送信するときは、
に、なると思いますが、送信をタップしてから
処理が完了するまで、30秒 - 40秒くらいの時間が
かかりました、これも、

あなたの教えてくれた番号に SMS 送信すると
すぐ終わらないのはなぜ?と言われますね

(環境依存であれば必ずしもではないのかもしれません)

(4) 国内送達率

たとえば 企業が顧客に対して SMS 送信をする場合に、
各顧客の端末に SMS が送信(到達) = 受信
できるかどうかの割合のことです

今回テストした環境では、送信者名の問題はあるにせよ、
Nexmo の場合は、送達時間も含めて
送達率は 100% 良好でした

経路の途中に何かがあると、送達率は低くなります

[ 6. デザート ]

本当は、@kidach1 様のように、
あわよくば WEBアプリで SMS 認証も
と思っていましたが、なんといっても、料金の問題と
送信者名表示の問題はいかんともしがたく、
環境問題のハードルが高いので、
メール と cloud sms を用いた sms 自動転送運用は、
現段階では 見送りになってます

RCS が今後どういう展開を見せるのか
imessage がどう変わっていくのか
といったところも踏まえて
何か別の方法を模索する必要がありそうです

.