この内容は日本向けです。SMS は国によって事情が異なるため、海外向け SMS の場合は別途記載します。
SMS とは
SMS (Short Message Service) は 1992/12/3 に初送信されました。世界初のメッセージは Merry Christmas だったそうです。
SMS のメリット
SMS は Email に比べて開封率や回答率が高く、特別なアプリのインストール不要で利用可能です。現在 SMS は 2FA での利用が主流ですが、クーポンや重要なお知らせなどの利用にも活用できます。
SMS 送信の仕組み
User (お客様) が API で Twilio に送信依頼すると、Twilio 内部で accepted, queued, sending のステータスを経て、failed ではない場合はキャリアに SMS 送信依頼 (sent) をします。Twilio は実際には SMS を送信せず、SMS を送信するのはキャリアの仕事となります。
キャリアは NTT や Softbank、au といった送信先端末のキャリア以外に、SMS を転送するだけのキャリアも存在します。送信先端末までは複数のキャリアをバケツリレーのように経由します。
キャリアは Twilio に delivered/undelivered を返すため、Twilio はそのままログに記録します。送信結果は Twilio コンソールもしくは Status Callback でリアルタイムに取得可能です。
キャリアからは Twilio に伝えられる undelivered には理由がないため、undelivered の調査には 48 時間以内の Message SID が必要となります。キャリアはログを 48 時間以上保持しないためです。そのため 48 時間を経過した調査はできないことをご了承ください。
- 参考資料
制限
-
Twilio は 070/080/090 電話番号を扱っていません。そのため SMS の送受信にはアメリカの電話番号か Alphanumeric Sender ID をご利用ください(Alphanumeric Sender ID は送信専用となります)
-
1 電話番号あたり 1 秒 10 送信可能です ( 10 MPS )。電話番号を増やすことで同時送信数を増やすことが可能です
-
SMS は日本語がある場合は約 670 文字、英数字のみの場合は約 1600 文字まで送信可能です。ただし 320 文字以下にすることで受信者に読みやすく、またキャリアの配送率が高まります。長文はキャリアにスパムと判断される可能性があるためです
-
同一宛先に送る場合は 1 分以上の間隔が必要です。キャリアが止める可能性があるためです
-
MMS、ショートコードは日本国内では利用できません
-
+メッセージ/RCS は現在サポートしていません
送受信
無料で SMS のテスト
Test Credentials を利用することでいくつかのテストをすることができます。無効な電話番号や、SMS 用ではない電話番号のテストに利用することができます。
送信
Twilio は日本国内の電話番号提供は 050/0120/0800 です。これらの番号は SMS 送受信に対応していないため、アメリカの電話番号 (+1) から送信するか、Alphanumeric Sender ID を使う必要があります。
テスト送信
SMS はキャリアを利用するため課金が発生します。テスト用の Account SID と Auth Token、専用のテスト番号を利用することで無料でいくつかのテストをすることができます。
Alphanumeric Sender ID
From に電話番号の代わりに下記を利用することができます。半角の3 文字以上 11 文字以下が可能です。
- 大文字 A-Z と小文字 a-z
- 数字
- スペース
- 一部の記号
- プラス ( + )
- マイナス ( - )
- アンダーバー ( _ )
- アンパサンド ( & )
ただし Apple など一部文字は利用できません。制限された文字は公開されていません。
日本では数字だけを指定することはできません。
海外では別途料金や申請が必要な場合があります。詳細は下記を参照ください。日本は申請不要で無料で利用可能です。
Alphanumeric Sender ID は送信専用です。受信することはできません。
スケジュール送信
cron など不要で指定日時に送信可能です。ただし 60 分前~7 日前を UTC 時間での指定が必要です。
大量送信
Messaging Services は複数の電話番号を利用することで大量送信が可能になります。
なお Twilio は大量送信してもキャリア側が送信を止めることがあるため、数万件規模を想定する場合は高品質 SMS をご検討ください。
https://www.twilio.com/blog/twilio-send-sms-at-scale
Sticky Sender
送信先電話番号を送信履歴と照合し、以前送った送信元電話番号から SMS を送信します。
テスト時は Sender Pool の Sender Selection Settings をクリックすることで表示される Sticky Sender は OFF にすることをお勧めします。Sticker Sender は一度成功した From の電話番号を使い続けるため、複数の電話番号を用意しても、常に特定の電話番号を利用するためスケールしないことがあるためです。
From と To の組み合わせ情報は 1 年間未使用の場合、自動で削除されます。
https://www.twilio.com/docs/messaging/services#sticky-sender
Scaler
大量の SMS を送信する際に、送信元の電話番号数に合わせてSMSのトラフィックを分散処理します。
https://jp.twilio.com/docs/messaging/services#scaler
Geomatch
アメリカとカナダに送信する場合、送信先電話番号の地域に合わせて、最適な送信元電話番号が選ばれます。本機能は日本では利用できません。
https://jp.twilio.com/docs/messaging/services#area-code-geomatch
https://support.twilio.com/hc/en-us/articles/223181268-What-is-Geomatch-and-how-does-it-work-
大量送信の Tips
- 高品質 SMS を利用
- 1 秒 10 通以下にする
- 複数の電話番号に分ける
- Sticky Sender オフ
- 電話番号がない、SMS に送信できない端末は次回送らない
- エラーが出て送れなくなる場合、キャリアが停止している可能性があるため、時間をおき、送信間隔をあける
受信
Twilio は日本国内の電話番号提供は 050/0120/0800 のため、アメリカの電話番号 (+1) で受信する必要があります。
受信に自動応答するには <Message> を使いますが、下記のように<Response> を書くだけで受信のみが可能です。
<?xml version="1.0" encoding="UTF-8"?>
<Response></Response>
受信を検知したい場合は StatusCallback をご利用ください。
スマホから日本の電話番号でアメリカの電話番号に送信する場合はキャリアから高額が請求されるためご注意ください。
- Receive SMS and MMS Messages without Responding – Twilio Support
- 特定の送信元からの SMS を受信拒否することはできますか? – Twilio - KDDI Web Communications
高品質 SMS
高品質 SMS は Twilio から国内キャリアに直接接続し、また文面も承認を得た内容を送信するため、通常の国際 SMS より到達率が高まる仕組みとなります。そのため送信先端末の電源オフや圏外には効果ありません。
申し込みには弊社までお問い合わせください。Account SID 単位で高品質 SMS を適用します。
なお、下記注意点や国際 SMS との違いがあります。
- 送信専用になります。From は他社と共通になります。専用電話番号も別途料金でご用意可能です
- From は契約時にご案内します
- 返信した場合、キャリアによっては返信がエラーになる場合と、エラーにはならず返信成功したように見えますが Twilio に届くことはありません
- 文面は固定になります(2FA 用の認証コードの数字部分など、一部可変可能)
- 高品質 SMS を設定すると、そのプロジェクトの SMS 料金は高品質 SMS になります。お客様にとって割高になるため、高品質 SMS 以外の SMS を利用する場合は別プロジェクトをご利用ください
- 料金体系はプロジェクトにひも付き、機能は Account SID 単位になります
- 親アカウントが高品質 SMS の場合、サブアカウントは国際 SMS でも料金は高品質 SMS
- 親カウントが国際 SMS でも、サブアカウントが高品質 SMS の場合は、親アカウントも高品質 SMS の料金
- SMS 全体に適用されるため Verify にも適用されます
- 料金体系はプロジェクトにひも付き、機能は Account SID 単位になります
エラー
調査ツール
Twilio コンソールにある Debugging Tools と Messaging Insights でエラーの種類と傾向を知ることができます。
- Debugging Tools - Twilio
- Explore Twilio's Messaging Insights - Twilio
- Debugging Common Issues with SMS - Twilio
エラー発生箇所
エラー発生箇所は大きく分けて Twilio 前、中、後があります。
Twilio 前
Twilio の API にアクセス前のエラーになります。そのため Twilio コンソールにはログが残りません。また課金も発生しません。
- SDK が例外を返すエラー
- 電話番号が E.164 形式と異なる、引数が足りないなどです。エラーメッセージをご確認ください
- Twilio の API エンドポイントに接続できなかった
- お客様環境でネットワークの問題がないか、Twilio 以外に外部接続できるかご確認ください
- Twilio で障害が発生していないか https://status.twilio.com/ をご確認ください
Twilio 中
Twilio 内部のエラーです。 accepted, queued, sending のまま 1 時間以上経過している、もしくは failed の場合です。 課金は発生しません。
- Twilio で障害が発生していないか https://status.twilio.com/ をご確認ください
- failed の場合は時間をおいて再送が可能かお試しください
Twilio 後
Twilio が sent 後、つまりキャリアもしくは送信先端末で発生するエラーです。キャリアが送信処理をするため、送信先端末への到達有無に関係せず課金が発生します。
下記理由が考えられます。
キャリアの場合
- 同一宛先に送信する場合は 1~2 分おいてから送信ください。キャリアにより 2 通目が遅延したり届かないケースがあります
- キャリアの障害。 https://status.twilio.com/ をご確認ください
- キャリアがスパムと判断した場合。文面や通数でキャリアが独自判断します。開発中にテストで自分宛に大量に送る場合にも発生することがあります。このルールはキャリア毎に異なり、また公開されていません。固定の短文もしくは 320 文字以上の長文で同じ宛先に複数送る場合はキャリアが止める確率が高いため、メッセージを変える、時間をおいて送るなどご注意ください。
- MNP の更新遅延。特定の電話番号に送信されない場合、ご連絡ください。MNP 後の情報がキャリアに共有されておらず送信されない場合があります
相手先端末の場合
- 電源が入っていない、バッテリー切れ、機内モード、端末故障など
- 圏外。エレベータや地下、建物内や場所の問題など
- データ SIM など SMS を受信しない端末
- 海外からの SMS を拒否する設定を有効にしている場合
- 端末側の一時的な問題や不具合。端末の再起動やOS 、ソフトウェアのアップデートで解消することがあります
delivered であっても SMS が送信先端末にない場合はキャリアの調査となります。キャリアはログを 48 時間のみ保存するため、48 時間以内の Messaging SID をお願いします。
エラーの種類
Twilio コンソールの Messaging Insights ではキャリアや電話番号で絞り込むことができます。
- 特定のキャリア
- キャリアの障害の可能性があります。時間をおいて送信をお試しください。
- 特定の電話番号
- 電源が入っていない、SMS 非対応の SIM、キャリアによる MNP 移転の失敗の可能性があります
- お手持ちのスマホで送信可能かお試しください
- キャリアの MNP 移転の失敗の場合はキャリアもしくは弊社にお問い合わせください
- 送信不可の対象
- 全てか、一部か
- 一時的か
- キャリアの障害や、送信先端末の電源が入っていない、圏外の可能性があります。時間をおいて送信をお試しください
- 24時間以上継続しているか
- キャリア障害ではない場合弊社にお問い合わせください
Twilio 側でキャリアの障害を検知した場合は https://status.twilio.com/ でご案内します。
30008
- ERROR - 30008 メッセージ配送 − 不明なエラー – Twilio Support
- SMSの送信コード 30008 は何が原因ですか? 料金は掛かりますか? – Twilio - KDDI Web Communications
429 "Too Many Requests".
Twilio の API へのアクセスが多い場合に発生します。指数バックオフでリトライしてください (再試行までの時間を指数関数的に増やしてください)。
国際 SMS が受信できない
送信キャリアやキャリアと接続している海外事業者が起因しているケースもあります。
弊社にご連絡いただくと同時にキャリアにもご相談ください。
双方から働きかけることによりスムーズに解決されることがあります。
- 参考資料
問い合わせ方法
キャリアのログ保存期間は 48 時間のため、48 時間経過した調査はできないことがあります。またキャリアは調査に 1~3 週間かかります。定期的にキャリアに進捗確認をしておりますが、お待ちくださいますよう、よろしくお願いいたします。
https://status.twilio.com/ で障害が発生していないことをご確認の上、下記情報をお願いします。
- 事象が発生したアカウントの Account SID(AC からはじまる英数字)
- エラーメッセージ
- SDK や https://jp.twilio.com/console/debugger のエラー情報
- ログ
- 問題が発生した Message SID(SM からはじまる英数字)を複数
- 同じ時間帯に正常に送信できた Message SID
- 各 Message SID の Date, From, To, Status, Error Code
- 特定のキャリアか、特定の電話番号か、特定できないか
- 特定できない場合は https://jp.twilio.com/console/sms/logs の CSV をお送りください。CSV にエラーの SMS が含まれていることを Status や ErrorCode をご確認ください
- 一時的か、24 時間以上継続しているか
到達率
到達率はお客様のご利用用途や送信先端末の母集団によって左右されるため回答できない事項になります。
例えば文面が薬物や公序良俗に反する内容の場合、キャリアにより到達率が 0% になることがあります。
また同じ通数を夜間は送ることができても、日中帯はキャリアによって停止されることがあります。
送信先端末がバッテリー切れなどにより電源が切れている、SMS を受信しない端末、圏外などの要因でも変わります。例えば社内の WiFi 環境と、電波状況の悪い屋外の場合では送信失敗は数%から数十%の違いがあります。
そのため平均を出すことはできませんが、キャリア要因や、電源や圏外といった送信先端末の問題がない場合、ほぼ 100% の到達率があります。
また高品質 SMS を利用することでキャリア要因を排除することができため、問題を送信先端末にほぼ限定することが可能です。
まずは国際 SMS で送信し、Status Callback を利用して送信に失敗したかを検知して高品質 SMS で再送する方法もご検討ください。
文字コードとセグメント
Twilio の API には UTF-8 で送る必要がありますが、SMS 自体は GSM-7 もしくは UCS-2 に変換されます。英数字と記号が GSM-7、英数字以外 (例えば日本語) の文字が含まれる場合は UCS-2 になります。正確な GSM 文字については Wikipedia を参照 ください。
送信可能な文字数は 1回の API で GSM-7 の場合は 1600 文字、UCS-2 が一文字でも含まれる場合は約 670 文字送信可能です。ただし内部的にはキャリアの仕様により 67 文字で分割され、分割単位で課金されます。
分割はされますが、受け取り側は 1 つの SMS に見えます。ただし、一部のキャリアは分割された SMS をばらばらに送るため、ばらばらに届く事象があります。これはキャリアの仕様のため Twilio では残念ながら制御することができません。なお、一部スマホのアプリ側でばらばらのメールを正しい順番で一つにする場合があります。
分割数ですが、GSM-7 は 160 文字以上ある場合は 153 文字毎に分割されます。UCS-2 は 70 文字以上は 67 文字で分割されます。この分割数を「セグメント」とし、課金の単位になります。バイト数ではなく文字数のため「あa」は UCS-2 の 2 文字になります。
日本語 (UCS-2) の場合
- 70 文字 → 1 セグメント
- 71 文字 → 2 セグメント (67 + 4 文字)
- 140 文字 → 3 セグメント (67 + 67 + 6 文字)
英語のみ (GSM-7) の場合
- 160 文字 → 1 セグメント
- 161 文字 → 2 セグメント (153 +8 文字)
GSM-7 の注意点として { } [ ] は SMS の仕様上、エスケープの必要があり二文字と数えます。
セグメント数は下記で簡単に確認できます。
https://twiliodeved.github.io/message-segment-calculator/
- 参考資料
StatusCallback
SMS が送信できなかった場合に Twilio は再送することはありません。
もし再送が必要な場合は StatusCallback を利用することで failed や undelivered を検知し、再送処理をお願いします。
0 コメント