2021/03/14

[Python]NexmoでSMSを送信

pythonsms

概要

とあるWebアプリで、携帯電話番号認証を実装する必要があり、そのために認証コードを携帯電話に送信する必要性が出てきました。

BackendにはPythonを使用しているためPythonで簡単にSMSを送信できるやり方がないか調査して対応しました。

流れ

Twilioを検討

まずは、APIを使ってSMSが日本国内に簡単に送信できるサービスがないかを探しました。

最初に検討したのは、Twilioでした。

私の中で実績を広く聞いていたため、なんとなく業界標準だと思い、こちらを採用しようとしました。

ところが、導入に時間がかかる(承認プロセスが必要)という最大のデメリットがありました。(詳細は以下)

これが原因で、SMSを送信するために必要な電話番号の購入ができませんでした。

とにかくすぐ実装して検証したいニーズがあったためTwilioの導入を断念しました。

Nexmoを検討

次にざっくり調べたところVonage APIというNexmoが提供しているものに目をつけました。

Twilioで必要な電話番号の購入が不要で、アカウントを作成してからものの数秒でSMSを送信できたため、こちらのサービスを導入を即座に決めました。

(SMSの送信を試すのにクレジットカードなどの登録は不要ってのもよかったです。)

以下ではPythonでの実装のメモを残しておきます。

実装

アカウント登録後にSMSの送信メニューにいくとやり方が載っていたので、めちゃくちゃ楽でした。

client install

% poetry add nexmo
# または pipの人は pip install nexmo

送信処理

  • 事前にダッシュボードからapi keyとsecretをメモしておきます。
  • From名や本文は英語じゃないと文字化けしてしまいました。(もしかしたらStringじゃなくて、日本語バイト列を渡したら日本語もいけるかもしれませんが、時間なくて検証してないです。)
import nexmo

VONAGE_API_KEY = "your-api-key"
VONAGE_API_SECRET = "your-api-secret"

client = nexmo.Client(
    key=VONAGE_API_KEY,
    secret=VONAGE_API_SECRET,
)
client.send_message({
    "from": "From Name",
    "to": "8190XXXXXXXX",   # 日本の国際電話番号のフォーマット(81から始まるやつ)
    "text": "This is test", # 送信したいメッセージ
})

以上になります。
とにかくすぐに導入したいという人はNexmoが良いのではないかと思います。