https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-to-send-sms-messages-with-python-flask-and-vonage/python-flash_sms.png

Python、Flask、VonageでSMSメッセージを送信する方法

最終更新日 April 9, 2026

所要時間:2 分

このステップバイステップのチュートリアルでは、PythonとFlaskを使用してSMSを送信する方法を紹介します。 Vonage Messages API を使っています。.動作する Web アプリを構築し、Webhook を設定し、リアルタイムで配信の受信を処理します。In-App Messaging の人気は高まっていますが、SMS は約束のリマインダーから緊急ブロードキャスト、2FA による本人確認に至るまで、いまだに様々なユースケースに役立っています。このチュートリアルが終わるころには、Vonage と Python Flaskアプリ.

チュートリアルに入る前に、サンプルアプリで使用されている用語や技術について説明します。すでにこれらの概念に慣れている方は PythonでSMSメッセージを送信するチュートリアルに進んでください。.

Vonage Messages APIでテキストを送信する方法

Vonage Messages APIはSMS、MMS、RCS、WhatsApp、Messenger、Viberと統合し、お好みのチャネルに合わせたコミュニケーションを可能にします。特に SMS に関しては、Messages API では API エンドポイントに HTTP リクエストを行うことで、プログラムでテキストを送信できます。APIは、受信者のデバイスに配信するために、携帯電話ネットワークにメッセージをダウンストリームに渡します。送信するメッセージのタイプにかかわらず APIには以下のフィールドが必要です:

  • メッセージのタイプ:送信するメッセージのタイプ、 textまたは image.

  • メッセージの内容:フィールドで宣言された内容。 message_typeフィールドで宣言された内容、つまりテキストメッセージまたは画像添付の一般にアクセス可能なURL。

  • 宛先メッセージの受信者。

  • 差出人メッセージの送信者。

  • チャンネル:メッセージを送信するチャンネル、 smsまたは mms.

リクエスト・ボディは次のようになる:

{
   "message_type": "text",
   "text": "Hello from Vonage",
   "to": "14155551234",
   "from": "14155551098",
   "channel": "sms",
}

A 202レスポンスには以下が含まれる:

{
   "message_uuid": "aaaaaaaa-bbbb-4ccc-8ddd-0123456789ab",
   "workflow_id": "3TcNjguHxr2vcCZ9Ddsnq6tw8yQUpZ9rMHv9QXSxLan5ibMxqSzLdx9"
}

ここで message_uuidはメッセージの一意識別子であり workflow_idはフェイルオーバー・ワークフローのIDを指し、リクエストがフェイルオーバー・プロパティで送信された場合にのみ存在する。これらの値の詳細については Messages API ドキュメント.

には Vonage Python SDKでは、API はこのように表現されます:

from vonage_messages import Sms

message = Sms(
	from_='14155551098',
	to='14155551234',
	text='Hello from Vonage!',
)

SMS APIとMessages APIの比較

Vonageには つのメッセージAPIがある。シンプルで専用のSMS APIと、より高機能なMessages APIです。SMS APIを使えば、プログラムでSMSメッセージを送受信できます。それだけであれば、このAPIで十分です。しかし開発者は、SMSを含むさまざまなチャネルでメッセージを送受信できるように、マルチチャネルのMessages APIを選択することが多い。言い換えれば、今日Messages APIを使い始めて、明日さらにチャンネルを追加したくなったとしても、統合を破棄して最初からやり直す必要はないということだ。

さらに、リクエスト構造とウェブフックのフォーマットはチャネル間で一貫している。SMS、MMS、RCS、WhatsApp、Viber、Facebook Messengerをサポートしています。Messages APIはリッチコンテンツもサポートしているので、メッセージに画像、ファイル、テンプレート、インタラクティブなメッセージを含めることができます。このチュートリアルでは、Messages APIを使用します。

SMS、MMS、RCS、その他のチャンネル

SMS

  • ショートメッセージサービスの略。

  • 標準化された通信プロトコルを使用して、短いテキストメッセージをデバイス間またはデバイスに送信する。

MMS

  • マルチメディア・メッセージング・サービスの略。

  • 画像、ビデオ、オーディオなどのマルチメディア・コンテンツや、1通のSMSメッセージで送信可能な長さのテキスト・コンテンツを送信できます。

  • 受信者がデータ通信やWi-Fiに接続することなく、モバイルネットワーク経由でメッセージを配信。

RCS

  • リッチ・コミュニケーション・サービスの略。

  • 携帯電話ネットワークに接続された機器との間でメッセージを送信するための通信プロトコル。

  • テキスト、写真、ビデオ、ファイルのほか、返信候補や行動提案ボタンなどのインタラクティブな要素を含めることができます。

  • MMSメッセージングと似ているところもあるが、重要な違いもある。

WhatsApp, メッセンジャーそして バイバー

  • デバイスを問わず、メッセージの送受信にはIn-Appが必要。

  • 誰がどのようにメッセージを送れるかについては、さまざまな条件がある。

概要ウェブアプリ、ウェブフック、トンネリング

Python Flaskアプリとは?

このチュートリアルでは、SMSを送信するWebアプリを作成します。 フラスコPython用の軽量かつ強力なWebフレームワークです。フレームワークとして、開発者はWebブラウザで実行するWeb技術を使用してソフトウェアアプリケーションを迅速にスピンアップすることができます。他の Python Web 開発フレームワークとは異なり、SMS アプリのサンプルを作成するのに必要なものだけを提供してくれます。

Webhookとは?

ウェブフックとは、あるウェブベースのアプリケーションがデータやイベント通知を別のアプリケーションにプッシュする方法のことで、一方のアプリケーションがもう一方のアプリケーションにアップデートを常にポーリングするのではなく、自動的な通信を可能にします。一般的には、HTTPリクエストを使ってAPI経由でウェブ上でやりとりすることを意味します。このチュートリアルでは、Webhook を使って Messages API を転送します。 配信レシートをFlaskアプリに転送します。

トンネリングとは何か?

このチュートリアルでは、ウェブアプリケーションを作成し、あなたのマシン上でローカルに実行します。ローカルで実行するため、公共のインターネットからアクセスすることはできません。もしウェブアプリにアクセスできなければ、Vonageはウェブフックにリクエストを出すことができません。そこでトンネリングの登場です。トンネリングは、一時的または静的なパブリックURLを通じて、ローカルサーバーをパブリックインターネットに公開します。 ngrokはこのサービスを提供するソフトウェア・プラットフォームだ。

要約すると、Python FlaskのWebアプリをWebhookで作成し、ngrokを使って公開URLにトンネリングしてローカルアプリケーションにアクセスできるようにします。 statusに投稿できるようにします。

チュートリアルPython、Flask、VonageでSMSメッセージを送る

このチュートリアルでは、Flaskを使ってテキストメッセージを送信するアプリを実装し、Webhookも定義します。ngrok を使って webhook を公開し、Vonage がリクエストできるようにします。

ご希望であれば SMSを送信するコードを送信するコードを Vonage コミュニティ GitHub.

前提条件

このチュートリアルを完了するには、以下のものが必要です:

チュートリアルのセットアップ

組み立てを始める前に、すべてのことを整理しておこう。

ngrokのアカウントを作成し、インストールし、トンネルをスピンアップする。

そのため、エンドポイントURLは公衆インターネットからアクセスできなければなりません。

ngrokをインストールしたら、ターミナル・ウィンドウを開いて実行する:

ngrok http 5000

このコマンドは、ローカルサーバーがポート5000にトンネリングするパブリックURLを生成します。公開URLはVonageアプリケーションを作成するときに使うので、以下のようになるはずです:

Forwarding                	https://4647-135-180-11-118.ngrok-free.app -> http://localhost:5000

ご注意ください:ngrokの有料プランを使用していない限り、生成された公開URLは永続的ではありません。つまり ngrokコマンドを実行するたびに、結果の URL は変更され、Vonage アプリケーションの設定を更新する必要があります。これを防ぐには、チュートリアルの間、ngrokを起動したままにしておきます。

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Messages APIを使用するので、以下の設定も必要です。 アカウント設定を設定する必要があります。開発者ダッシュボードの左側のナビゲーションから API設定.で SMS設定セクションで メッセージAPIを選択し、付随するプロンプトを完了させて変更を保存します。

A screenshot of the API Settings menu in the Vonage developer dashboard indicating where to configure the SMS settings to use the Messages API.A screenshot of the API Settings menu in the Vonage developer dashboard indicating where to configure the SMS settings to use the Messages API.Messages APIアプリケーションを作成し、マイナンバーをリンクする。

まず、Messages APIアプリケーションを作成する必要があります。ここで言う「アプリケーション」とは、以下のようなものだ。 Messages APIに必要なコンフィギュレーションとセキュリティ情報のためのコンテナです。.これから作成するFlaskのWebアプリケーションとは異なります。

Messages APIアプリケーションの作成 開発者ダッシュボードに移動して アプリケーションウィンドウに移動し 新規アプリケーションの作成ボタンをクリックします。アプリケーション作成メニューが開きます。アプリケーションに名前を付けます。 send-sms.

以下の 機能セクションで メッセージのオプションを切り替える。テキスト・フィールドの ステータス URLというテキストフィールドに、Flask アプリで定義する webhook で修正した ngrok 公開 URL を入力します。これは次のようになります。 https://0a6ec0a950eb.ngrok-free.app/webhooks/message-status.

このチュートリアルでは受信メッセージを扱わないので 受信URLは使いません。しかし、アプリケーションを作成するには URL が必要です。 http://example.com/webhooks/inboundを指定できます。

新規アプリケーションの作成」ボタンをクリックします。

A screenshot of the Create an application menu in the Vonage developer dashboard indicating which options need to be configured in order to create a Messages application.A screenshot of the Create an application menu in the Vonage developer dashboard indicating which options need to be configured in order to create a Messages application.アプリケーションの作成が完了したら、次のリンクをクリックしてマイナンバーをアプリケーションにリンクできます。 リンクボタンをクリックします。必ずSMSとMMS機能のある番号を選択してください。

プロジェクト・ディレクトリの作成

新しいターミナル・ウィンドウで、以下を実行して新しいプロジェクト・ディレクトリを作成し、その中に移動する:

mkdir vonage-send-sms && cd vonage-send-sms 

建築を始めよう

すべての準備が整ったところで、いよいよビルド開始だ。

以下のステップをクリックして、お好きなセクションにスキップしてください:

  1. Python仮想環境の作成と有効化

  2. 依存関係をインストールする

  3. アプリケーションIDと秘密鍵を生成し、環境変数に追加します。

  4. コードを書いて実行する

  5. お試しあれ!

1.Python仮想環境を作成し、アクティベートする

Python 仮想環境を使うと、システムの他の部分から隔離された場所にパッケージをインストールすることができます。これはシステム全体の混乱や、異なる Python バージョンやパッケージとの衝突を防ぐのに役立ちます。もっと詳しく知りたい方は 仮想環境.

プロジェクト・ディレクトリで、以下のコマンドを実行して仮想環境を作成し、仮想環境をアクティブにします:

python3 -m venv venv && source venv/bin/activate

これでターミナルのプロンプトの先頭に (venv).仮想環境を停止するには deactivateコマンドを実行してください。

2.依存関係のインストール

このチュートリアルで必要な依存関係をインストールするために、以下を実行する:

pip install vonage flask python-dotenv Jinja2 flask-socketio

3.アプリケーションIDと秘密鍵を生成し、環境変数に追加する。

開発者ダッシュボード Applicationsメニューメニューで、このチュートリアル用に作成したアプリケーションをクリックし をクリックします。.編集ウィンドウが開いたら、"公開鍵と秘密鍵を生成する "というボタンをクリックします。これにより、秘密鍵が拡張子 .key. このファイルは秘密にしておき、漏洩する可能性のある場所では共有しないでください。このコードをどこかに公開するつもりなら、秘密鍵ファイルを必ずあなたの .gitignoreファイルに追加してください。

Save changes "ボタンをクリックし、Application IDも記入してください。

A screenshot of the application Edit menu in the Vonage developer dashboard showing where to generate a public and private key.A screenshot of the application Edit menu in the Vonage developer dashboard showing where to generate a public and private key.A screenshot of the Messages application in the Vonage developer dashboard indicating where you can find the application ID.A screenshot of the Messages application in the Vonage developer dashboard indicating where you can find the application ID.秘密鍵ファイルをプロジェクト・ディレクトリに移動する。同じディレクトリに .envという名前のファイルを作成し、以下の変数を追加します:

APPLICATION_ID=replace-this-with-your-application-ID
PRIVATE_KEY=replace-this-with-the-name-of-your-private-key-file
VONAGE_VIRTUAL_NUMBER=replace-this-with-your-virtual-number

また テンプレートもあります。 さらに詳しく知りたい方は 環境変数.

4.コードを書いて実行する

このチュートリアルでは、Messages API を使って Web フォームから SMS を送信する最小限の Flask アプリケーションを作成します。このフォームを作成するには、以下のものが必要です:

  1. Pythonのアプリケーションコード。

  2. そして、ブラウザでレンダリングされるHTMLテンプレート。

Pythonアプリケーションコード

プロジェクト・ディレクトリに app.pyという名前のファイルを作成する:

import os

from dotenv import load_dotenv
from flask import Flask, redirect, render_template, request, url_for
from flask_socketio import SocketIO
from vonage import Auth, Vonage
from vonage_messages import Sms

load_dotenv()

APPLICATION_ID = os.getenv("APPLICATION_ID")
PRIVATE_KEY = os.getenv("PRIVATE_KEY")
VONAGE_VIRTUAL_NUMBER = os.getenv("VONAGE_VIRTUAL_NUMBER")

if not APPLICATION_ID or not PRIVATE_KEY or not VONAGE_VIRTUAL_NUMBER:
	raise RuntimeError("Missing APPLICATION_ID, PRIVATE_KEY, or VONAGE_VIRTUAL_NUMBER env vars")

client = Vonage(Auth(application_id=APPLICATION_ID, private_key=PRIVATE_KEY))

app = Flask(__name__)
socketio = SocketIO(app)


@app.route('/')
def index():
	return render_template('index.html')


@app.route("/delivery_receipt/<message_uuid>")
def delivery_receipt(message_uuid):
	return render_template("delivery_receipt.html", message_uuid=message_uuid)


@app.route("/webhooks/message-status", methods=["POST"])
def message_status():
	data = request.get_json(silent=True) or {}
	message_uuid = data.get("message_uuid")
	status = data.get("status")

	if not message_uuid or not status:
    	return {"error": "missing message_uuid/status"}, 400

	payload = {"message_uuid": message_uuid, "status": status}

	err = data.get("error")
	if isinstance(err, dict):
    	payload["info"] = f"{err.get('title', 'Error')} : {err.get('detail', '')}"

	print(f"Status update uuid={message_uuid} status={status}")

	socketio.emit("status_update", payload)

	return "200", 200

@app.route("/send_sms", methods=["POST"])
def send_sms():
	to_number = (request.form.get("to_number") or "").strip()
	message = (request.form.get("message") or "").strip()

	print(f"To number is ===> {to_number}")

	if not to_number or not message:
    	return {"error": "to_number and message are required"}, 400

	response = client.messages.send(
    	Sms(
        	from_=VONAGE_VIRTUAL_NUMBER,
        	to=to_number,
        	text=message,
    	)
	)

	message_uuid = response.message_uuid
	print(f"Message UUID is ===> {message_uuid}")

	return redirect(url_for('delivery_receipt', message_uuid=message_uuid))


if __name__ == '__main__':
	socketio.run(app)

ここで何が起こっているのかを見ていこう。

コードの最も重要な部分は send_smsルートと関数です。ここでMessages APIを使ってSMSを送信します。この例では、オンラインフォームを使ってメッセージの詳細を入力し、Messages APIへのリクエストをトリガーしています。フォームが送信されると、アプリは次のページにリダイレクトします。 delivery_receiptページにリダイレクトされます。

次に注目すべきブロックは message_statusルートと関数です。これは ステータスURL に設定したウェブフックです。ここでVonageはアプリから送信されたメッセージのステータスのアップデートを送信します。

通常、メッセージ・ステータスの更新にはデータベースやポーリングを使用することがあるが、今回は最小限のデモ・アプリなので、WebSocketを使用することにする。 WebSocketは、サーバーとブラウザー間の通信を可能にするプロトコルです。通信が双方向かつリアルタイムであるため、RESTful HTTPよりも優れています。このため、クライアントが定期的に更新をポーリングする代わりに、サーバーがいつでもクライアントに通知することができる。

この例では socketioライブラリを使用して通信チャネルを確立しています。このようなステータスの更新は、配達受領のページに反映されます。そうすることで、メッセージが規制などで失敗した場合でも、ステータスと追加情報をリアルタイムで確認することができます。

HTMLテンプレート

プロジェクト・ディレクトリに templates.A templatesディレクトリは フラスコ規約:ディレクトリはFlaskの規約です。 templatesディレクトリを検索するように設定されています。

その templatesディレクトリに2つのファイルを作成する: index.htmldelivery_receipt.html.それぞれのコードをコピーして GitHubのレポから.

これで、コードを実行するために必要なものはすべて揃った。ウェブアプリをローカルにデプロイするには、プロジェクトのルート・ディレクトリから以下のコマンドを実行する:

flask run

これは http://127.0.0.1:5000.ウェブ・ブラウザでその場所に移動すると、次のようなものが表示されるはずだ:

A screenshot of the web app created for the tutorial with a form to send an SMS.A screenshot of the web app created for the tutorial with a form to send an SMS.5.試してみてください!

テキストを受信したい電話番号(国番号付き)と送信するメッセージをフォームに入力してください。

お住まいの地域のSMS規制によっては、フォームに入力された情報を使用してVonageバーチャル番号からSMSメッセージを受信します。しかし、国の規制によってVonageバーチャル番号からのSMS送信が制限される場合があるため、メッセージが成功したかどうかに関わらず、FlaskアプリはVonageからリアルタイムで配信レシートを作成します。

A screenshot of the web app created for the tutorial showing a message delivery receipt.A screenshot of the web app created for the tutorial showing a message delivery receipt.ご注意ください:世界各国でSMSの規制が異なるため、Vonageのバーチャル番号からSMSを送信しようとすると、Vonageからエラーコードが表示される場合があります。その場合は 開発者ダッシュボードでログを見ることができます。ログを選択してください。SMS規制の詳細については、特に10桁の米国番号を使用している場合は、次のブログ記事を参照してください。 10DLCについて知っておくべきこと.

まとめ

このチュートリアルでは、Python、Flask、Vonage Messages API を使って SMS メッセージを送信する手順を説明しました。SMS はアラートから認証まで様々なアプリケーションで重要な役割を果たし続けており、このガイドは SMS 対応の Web アプリを構築するための実践的なアプローチを提供します。

Flaskアプリケーションをセットアップし、Vonage APIを統合し、ngrokを利用してローカルサーバーをインターネットに公開し、リアルタイムのメッセージング機能を実現する方法を学びました。このチュートリアルでは、API の設定、メッセージのステータス更新のための webhook 処理、SMS を送信するためのユーザーフレンドリーな web フォームの作成などの重要なコンポーネントを取り上げました。

さらに、SMS規制とその意味を理解することで、コンプライアンスに準拠したメッセージングを実践し、Vonageがメッセージを送信できない理由を説明することが強調されました。この制約は、あなたのアプリが完全に機能しないことを意味するかもしれませんが、少なくとも、Messages APIの基本的な理解と、その上に構築するための基盤を持つことができます。ここから、APIと他のメッセージング・チャネルをさらに探求し、ビジネス・ニーズにテキスト通信を活用することができます。

参考文献とリソース

ご質問がある場合、またはあなたが作っているものを共有したい場合は、こちらをクリックしてください。

最新の開発者向けニュース、ヒント、イベント情報をお届けします。

シェア:

https://a.storyblok.com/f/270183/400x400/2c4345217d/liz-acosta.jpeg
Liz Acostaデベロッパー・アドボケイト

Liz AcostaはVonageのDeveloper Advocateです。映画学生からマーケター、エンジニア、デベロッパー・アドボケイトという彼女のキャリア・パスは型破りに見えるかもしれないが、デベロッパー・リレーションズにとってはごく一般的なものだ!ピザ、植物、パグ、Pythonが大好き。