TwilioのSMSでオプトアウトを自動化する

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

みなさん、こんにちは。
KDDIウェブコミュニケーションズ Twilio エバンジェリストの高橋です。

## 最近のSMS動向

SMSって最近非常に増えてきましたね。
実際、メールに比べて到達率が高くユーザーの反応も非常に早いことから、SMSをマーケティングツールとして活用しようという動きが加速してきています。

しかし一方で、SMSを使ったフィッシング詐欺も増えてきていて、社会問題化されるようになってきました。そのため一部のキャリアでは、フィッシングSMS対策機能を提供するとのニュースも届きました。
[ドコモとソフトバンク、フィッシングSMS対策機能を提供--利用料は無料](https://japan.cnet.com/article/35182045/)

SMSが広く普及している米国では、すでにSMSへの規制が厳しくなってきていて、配信事業者はルールを厳守しなくては罰金を課されることもあります。
Twilioもこうした動きと連携し、罰則を設けています。詳しくは[こちら](https://support.twilio.com/hc/en-us/articles/4410588996123-U-S-Carrier-Penalties-for-Non-Compliant-Messaging)。
現在のところこの罰則については、米国内への配信が対象となっているため、現時点では日本宛のSMS送信には適用されません。
ただし、この流れは日本でも今後加速してくると予想されていますので、これからSMSを使ったサービスを提供される方や、すでにSMSをご利用中の皆さんも対岸の火事では済まされません。

## SMSを安全に運用するために

米国ほど規制が厳しくない日本において、ユーザーからの信頼を得たSMS送信をするためにはどうすればよいでしょうか。
現時点で考えるられる対策は以下のとおりです。

- Alphanumeric Sender ID を極力使わない
- オプトイン・オプトアウトの仕組みをしっかり作る

### Alphanumeric Sender ID とは

TwilioのSMS送信は、高品質SMSサービスを除いて、海外ルートから配信される国際SMSになります。そのため、送信元電話番号は海外の番号が利用されます。Alphanumeric Sender ID を利用することで、海外の電話番号を文字にして送信することができるのが、Alphanumeric Sender ID です。

たとえば、企業がSMSを送信する際に、海外の番号ではなく企業名で送信が可能になるため、利用したいと考えるのは至極当然です。しかし、この機能は<font color='red'>送信主を認証しているわけではない</font>ので、たとえば悪意のある第三者が、その企業と同じ名前を騙ってSMSを送信することもできてしまいます（一応、著名な企業名などはチェックされますが、一般企業ではチェックの対象にはなりません）。

すなわち、Alphanumeric Sender ID を使って、企業ブランドでSMS送信をすることは、逆にフィッシングのターゲットにもなり得ることを意味します。なので、安全なSMSを運用するためには、現時点では極力 Alphanumeric Sender ID は使わず、海外の番号をそのまま利用して送信したほうがよいです。そして、<font color='red'>SMSを送信する番号はこの番号ですというアナウンスを行う</font>ことです。
ちなみに、Twilioの提供する Alphanumeric Sender ID は、数字だけの指定ができないため、電話番号を使ってのなりすましはできません（他の事業者のことはわからないので、なりすまし自体を否定しているわけではありません）。

### オプトイン・オプトアウト

SMSを送信する前に、ユーザーに対して同意を得る行為を「オプトイン」、送信後にユーザーからの配信停止に対応する行為を「オプトアウト」といいます。これらはどちらも非常に重要な手続きで、SMSを送信するサービスを構築する際には必ず必要となります。

ここで重要なことは、**ユーザーが主体**となっていることです。これはすなわち、ユーザー自身が購読も停止もコントロールできることを意味します。

たとえばオプトインを実現する方法としてよくあるのが、ユーザーの電話番号を取得する際に利用規約に同意してもらうことです。また、電話による問い合わせに対してその場でSMSを送信するようなケースでは、IVR もしくは口頭ベースで配信の許可を行うことになります。

一方、オプトアウトについては少し面倒です。メールなどでは、メール内に配信停止リンクを設定することで、ユーザー自身での配信停止が可能になっているケースがほとんどですが、SMSの場合はちょっと事情が異なります。

まず、SMSで送信できる文字数は限られているため（通常、全角70文字）、あまり長い文章を入れたり、URLを貼り付けることが難しいケースが多いです。もちろん、70文字以上のSMSを送信することも技術的にはできます（コンカチSMS）が、その分送信料が高くなります。
そのため、別途ユーザーサイト上に配信を停止するボタンを設置したり、問い合わせ窓口経由で配信停止を行うなど、実はSMS配信を停止する仕組みを実装するのはハードルの高い作業なのです。

## オプトアウトを自動化する

メルマガなどでは、件名や本文に「配信停止」と記載することで自動的に配信が停止する機能があります。同様に、SMSでも「配信停止」とユーザーに送信してもらうことでオプトアウトが実現できれば便利そうです。もちろん、そのことは、たとえば以下のように、初回のSMS送信の際に事前にユーザーに通知しておくとよいでしょう。

初回のSMS送信文の例

```text
ご登録ありがとうございます。弊社からのSMSは、こちらの番号からのみ送信されます。配信停止は、「配信停止」と送信してください。
```

### 実装はどうするか

では、この仕組みを実装する方法について考えてみましょう。

Twilioの国際SMSは、ユーザー側からの送信についてキャリアの高額な国際SMS料金がかかるため、基本的には企業側からの送信のみの運用としているケースがほとんどです。そのため、Twilio 上の設定で、メッセージを受信したときの`Webhook`を空欄にして運用します。

![スクリーンショット 2022-02-08 11.11.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/c2ca701b-2685-e92c-bbe5-ce1568689989.png)

こうすることで、仮にユーザーからSMSが送られてきたとしても、着信は拒否され、課金されることはありません。

一方、自前で上記のようなオプトアウトを実装しようとすると、以下のような作業が必要になるでしょう。

- SMSの着信を許可する（配信停止以外のメッセージでも課金が発生します）。
- 「配信停止」と書かれていた場合は、その番号をデータベースなどに記録するプログラムを作成し、それを電話番号の着信動作として実装する。
- SMSを送信する際には、そのデータベースを参照し、登録されている電話番号には送信しないように制限をかける。
- 必要に応じて、配信を再開する仕組みも実装する。

どうです？面倒ですよねー。
でも、Twilio には、<font color='red'>**オプトアウトを自動化する仕組みがある**</font>のです！

では実際に、オプトアウトの自動化と、配信再開の自動化を実装してみましょう。

## Messaging サービスの設定

SMSのオプトアウトを自動化する設定は、Messaging の設定項目の中に存在します。

### Messaging サービスの作成

- 管理コンソールにログインします。
- Messagingの中の**Services**を選択します。

![スクリーンショット 2022-02-08 15.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/4b62bf78-6456-800a-16f8-6f0a198c21d2.png)

<font color='red'>すでにメッセージングサービスが存在する場合は、そちらのメッセージングサービスを選択して、[Messaging サービスの設定](https://qiita.com/drafts#%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A)に進んでください。</font>

- **Create Messaging Service**ボタンを押します。

![スクリーンショット 2022-02-08 15.31.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/384a58eb-2573-964f-6b10-8fa1c8faba25.png)

- **Messaging Service friendly name**欄には、適当な識別子（例えば「SMS」）を入力します。
- **Select what you want to use Messaging for**のリストボックスは、「Notify my users」のままにしておきます。
- **Create Messaging Service**ボタンを押します。

![スクリーンショット 2022-02-08 15.34.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/ebeac259-cd65-ae14-82f6-118cd8d63229.png)

- そのまま、**Step 3: Set up integration**ボタンを押します。

![スクリーンショット 2022-02-08 15.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/e13bdc09-d0e6-d5e0-670d-6d2e73e1c6f7.png)

- **Incoming Messages**の中の選択肢から、「Drop the message」を選択します。
- **Step 4: Add compliance info**ボタンを押します。

![スクリーンショット 2022-02-08 15.39.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/239fee90-a586-ec0c-fc9e-20d1f41a8ac9.png)

- **Complete Messaging Service Setup**ボタンを押します。
- 以下のようなダイアログが表示されます。

![スクリーンショット 2022-02-08 15.41.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/3a7931eb-3140-5c86-2070-d19aec8142ab.png)

- **View my new Messaging Service**の方のボタンを押します。

### メッセージングサービスの設定

作成されたメッセージングサービスのサブメニューの中に、**Opt-Out-Management**という項目があるので、そちらを選択します。

![スクリーンショット 2022-02-08 15.43.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/a431d343-43ef-cd34-91d5-ea74553559a7.png)

- **Language-Specific Opt-Out Keywords**の中にある、**Add Opt-Out Keywords**リンクをクリックします。

![スクリーンショット 2022-02-08 15.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/ddcc36e5-0a48-b409-884b-e462c07b9b51.png)

- **Language**のプルダウンリストから「Japanese」を選択します。

続けて、その下の設定も行います。

![スクリーンショット 2022-02-08 15.55.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/ed92d257-1a7b-084c-35db-640161d9c3ec.png)

- **Opt-out**の中の**Keywords**に、ユーザーが配信停止をするために入力するキーワードを登録します。今回は「配信停止」と入力します。
- **Confirmation Message**には、配信を停止した旨のメッセージを入力します。今回は、「配信を停止いたしました。再開をご希望の際は、「配信開始」というメッセージを送信してください。」と入力します。
- **Opt-in**の中の**Keywords**には、一度配信を停止したユーザーが配信を再開したい場合のキーワードを登録します。今回は「配信開始」と入力します。
- **Confirmation Message**には、配信を開始した旨のメッセージを入力します。今回は、「配信を開始いたしました。停止をご希望の際は、「配信停止」というメッセージを送信してください。」と入力します。

続いて、その下の設定もしていきましょう。

![スクリーンショット 2022-02-08 16.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/cbe0082c-e4b6-d357-c15e-5c6faaa1a40a.png)

- **Help**の中の**Keywords**には、ユーザーからの問い合わせキーワードを登録します。今回は「ヘルプ」と入力します。
- **Confirmation Message**には、対応するメッセージを入力します。今回は、「お手数ですが、サービスサイトからお問い合わせください。」と入力します。

- **Save**ボタンを押して設定を保存します。

では最後に、この自動オプトアウトを有効にしましょう。

![スクリーンショット 2022-02-09 7.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/29a2ec26-718b-141e-7232-e9e16eaee8af.png)

- 画面上部にある、**Enable Advanced Opt-Out**ボタンを押します。
- Opt-Out Managementの右側に、**Enabled**と表示されれば設定は有効です。

## SMS番号の設定

続いて、電話番号側の設定をしていきます。
今回はすでにSMS送信用の番号として、US番号を１つ購入しているものとします。

- 管理コンソールの**Phone Numbers**から、**Active numbers**を選択します。
- 購入済みの電話番号一覧が表示されるので、設定した電話番号を選択します。

![スクリーンショット 2022-02-08 16.10.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/2021c6a2-271e-739a-84e3-9d197cfe97cb.png)

- **Voice & Fax**の中の**A CALL COMES IN**が「Webhook」になっていて、さらにその下が空になっていることを確認します。もし、空になっていない場合は設定を削除しておいてください。

次に**Messaging**の項目を設定していきましょう。

![スクリーンショット 2022-02-08 16.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/5b92e7fc-2e05-0cda-f5b1-75ce6d9fa7ba.png)

- **MESSAGING SERVICE**のプルダウンリストから、先程生成した、もしくは設定した Messaging Service を選択します。
- **A MESSAGE COMES IN**は、「Webhook」が選択されており、その下が空になっていることを確認します。もし空になっていない場合は設定を削除しておいてください。

- 以上で設定は完了です。**Save**ボタンを押して、設定を保存します。

## テスト

ではいよいよテストをしましょう。
先程設定した電話番号を使って、実際にSMSが送信できることを確認します。

![スクリーンショット 2022-02-09 8.12.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/63fe6ba8-445f-dc47-df50-af4ca3087749.png)

では次に、「配信停止」と送信してみましょう。

![スクリーンショット 2022-02-09 8.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/3d223d37-a5f9-3a12-968b-d49a211e0283.png)

先程登録した確認メッセージが正しく表示されることを確認します。もし、メッセージが戻ってこない場合は、 Opt-Out Management が有効になっていない可能性がありますので、先程の手順をもう一度確認してみてください。
ちなみに、この確認メッセージについては、Twilio上にはログとして記録されず、課金もされません。

ではこの状態で、もう一度Twilio側からSMSを送ってみましょう。
今度は、ユーザーが配信停止をしているのでメッセージが送れないというエラーが戻ってきます。

`Error code 21610 from Twilio: Attempt to send to unsubscribed recipient. See https://www.twilio.com/docs/errors/21610 for more info.`

もちろん、ユーザー側にはメッセージは配信されていません。また、この送信については、Twilio上のログにも記録されませんし、課金もされません。

このオプトアウトの仕組みは、発信元の電話番号と相手先の電話番号のペアで管理されるため、たとえば送信用に別の番号を取得し、同じ Messaging Service　を割り当てたとしても、送信元番号が違えばオプトアウトは引き継がれません。

# まとめ

オプトアウトの自動化についてのまとめです。

- オプトアウトの自動化は、Messaging Service のオプションとして提供されます。
- Messaging Service の料金はSMSの料金に含まれるため、オプトアウトも無料で利用できます。
- 番号の設定でWebhookを指定しない状態でもオプトアウトは利用できます。
- 配信停止、配信開始の確認メッセージは、Twilio側で自動的に送信され、ログにも記録されず料金もかかりません。
- 配信停止状態のユーザーへのメッセージもログには記録されず、料金もかかりません。
- 配信停止は、送信元番号と配信先番号のペアで管理されています。
- 配信停止中のユーザーからのメッセージについては、Webhookが設定されていれば処理は可能です。

今回は、あまり知られていないけれど、とても便利な機能として、オプトアウトの自動化について解説をしました。この他にもSMS送信サービスをご検討中の方で、ご質問やご相談がある方は、ぜひ毎週水曜日に開催しております相談会にお申し込みください。
相談会の申し込みは[こちら](https://cloudapi.kddi-web.com/contact/consultation?hsLang=ja-jp)です。

---
### Twilio（トゥイリオ）とは

https://cloudapi.kddi-web.com
Twilio は音声通話、メッセージング（SMS /チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウド API サービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。

自己紹介|　
:--|:--
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/b51a8b88-abd5-ce5e-195a-de3564ba2ae6.png" height='200' width='150'/>|高橋克己（Katsumi Takahashi） 自称「<font color='red'>赤い芸人</font>」<br />グローバル・インターネット・ジャパン株式会社　代表取締役<br />株式会社KDDIウェブコミュニケーションズ　Twilio事業部エバンジェリスト<br /><br />2001年より大手通信事業者の法人サービスの教育に携わり、企業における電話のしくみや重要性を研究。2016年よりTwilio事業部にジョインし、Twilioを使ったスマートコミュニケーションの普及活動を精力的に行っている。<br />2015 Hall of Doers<br />2019 Twilio Champions