LoginSignup
10
11

More than 3 years have passed since last update.

f3: sms 自動転送を考えてみる

Last updated at Posted at 2018-10-07

.
/ 2019/08/02 訂正 /
/ sms-receive.php 内の mb_send_mail 処理が抜けていたため /

昨今の 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";

     if (mb_send_mail($to, $subject, $message, $headers)) {
        //   echo "send mail is OK";
     } else {
        //   echo "send mail is NG";
     } 

 }

?>

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

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

( この場合は 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 がどう変わっていくのか
といったところも踏まえて
何か別の方法を模索する必要がありそうです


.

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11