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

Cómo enviar mensajes SMS con Python, Flask y Vonage

Publicado el April 9, 2026

Tiempo de lectura: 14 minutos

Este tutorial paso a paso te muestra cómo enviar SMS con Python y Flask utilizando la Mensajes API de Vonage. Construirás una aplicación web funcional, configurarás webhooks y gestionarás los recibos de entrega en tiempo real. Aunque la mensajería dentro de la aplicación ha aumentado en popularidad, los SMS aún sirven para una variedad de casos de uso, que van desde recordatorios de citas hasta transmisiones de emergencia y verificación de identidad a través de 2FA. Al final de este tutorial, serás capaz de implementar con éxito el andamiaje necesario para enviar un SMS utilizando Vonage y una aplicación de aplicación Python Flask.

Antes de pasar al tutorial, trataremos algunos de los términos y tecnologías utilizados en la aplicación de ejemplo. Si ya estás familiarizado con estos Concepts, puedes pasar al tutorial sobre el envío de mensajes SMS con Python.

Cómo funciona el envío de mensajes de texto con Messages API de Vonage

Messages API de Vonage se integra con SMS, MMS, RCS, WhatsApp, Messenger y Viber, lo que permite una comunicación adaptada al canal de tu elección. Cuando se trata de SMS en particular, Messages API te permite enviar mensajes de texto mediante programación haciendo una solicitud HTTP a un punto final de API. La API transmite el mensaje a la red de telefonía móvil para su entrega al dispositivo del destinatario. Independientemente del tipo de mensaje que envíe, la API API requiere los siguientes campos:

  • Tipo de mensaje: El tipo de mensaje a enviar, es decir text o image.

  • Contenido del mensaje: El contenido declarado en el campo message_type es decir, el mensaje de texto o la URL de acceso público de la imagen adjunta.

  • Para: El destinatario del mensaje.

  • De: El remitente del mensaje.

  • Canal: El canal por el que se envía el mensaje, es decir, sms o mms.

El cuerpo de la solicitud tiene este aspecto:

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

A 202 respuesta contiene lo siguiente:

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

Donde message_uuid es el identificador único del mensaje y workflow_id se refiere al ID del flujo de trabajo de conmutación por error, que sólo está presente si la solicitud se envió con la propiedad de conmutación por error. Puede obtener más información sobre estos valores en la documentación de la API de Messages.

En el Vonage Python SDKla API se representa así:

from vonage_messages import Sms

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

La SMS API frente a la Messages API

Vonage dispone de dos API de mensajeríauna API de SMS simple y dedicada y una API de Messages más capaz. La SMS API te permite enviar y recibir mensajes SMS mediante programación. Si eso es todo lo que necesitas, esta API hará el trabajo. Sin embargo, los desarrolladores suelen elegir la Messages API multicanal para poder enviar y recibir mensajes a través de distintos canales, incluido SMS. En otras palabras, si empiezas hoy con la Messages API y mañana quieres añadir más canales, no tienes que arrancar tu integración y empezar de nuevo.

Además, la estructura de las solicitudes y los formatos de los webhooks son coherentes en todos los canales. Es compatible con SMS, MMS, RCS, WhatsApp, Viber y Facebook Messenger. La Messages API también admite contenido enriquecido, por lo que tus mensajes pueden incluir imágenes, archivos, plantillas y mensajes interactivos en los canales que los admitan. En este tutorial utilizaremos la API de Messages.

SMS, MMS, RCS y otros canales

SMS

  • Servicio de mensajes cortos.

  • Utiliza protocolos de comunicación estandarizados para enviar mensajes de texto cortos a o entre dispositivos.

MMS

  • Servicio de mensajería multimedia.

  • Permite enviar contenidos multimedia como imágenes, Video, audio, así como contenidos de texto más largos de los que se pueden enviar en un solo mensaje SMS.

  • Envía mensajes a través de la red móvil sin necesidad de que el destinatario tenga una conexión de datos o Wi-Fi.

RCS

  • Significa Servicios de Comunicación Enriquecidos.

  • Es un protocolo de comunicación para enviar mensajes a y entre dispositivos conectados a una red de telefonía móvil.

  • Puede incluir texto, fotos, vídeos y archivos, así como elementos interactivos como botones de respuesta sugerida y acción sugerida.

  • Tiene algunas similitudes con la mensajería MMS, pero también algunas diferencias importantes en el mensaje.

WhatsApp, Messengery Viber

  • Requiere una aplicación para enviar y recibir mensajes, independientemente del dispositivo.

  • Tiene diferentes requisitos sobre quién puede enviar mensajes y cómo.

Un breve resumen: Aplicaciones Web, Webhooks y Tunneling

¿Qué es una aplicación Python Flask?

Para este tutorial, crearemos una aplicación web para enviar un SMS utilizando Flaskun framework web ligero y potente para Python. Como marco de trabajo, permite a los desarrolladores crear rápidamente una aplicación de software utilizando tecnologías web para ejecutarla en un navegador web. Lo hemos elegido para este tutorial por su facilidad de uso y su enfoque minimalista: a diferencia de otros marcos de desarrollo web de Python, sólo nos ofrece lo esencial para crear una aplicación SMS de ejemplo.

¿Qué es un Webhook?

Un webhook es la forma en que una aplicación web envía datos o notificaciones de eventos a otra aplicación, permitiendo la comunicación automática en lugar de tener una aplicación constantemente sondeando a la otra en busca de actualizaciones. En general, esto significa interactuar a través de la web mediante una API utilizando una petición HTTP. En este tutorial en particular, utilizaremos un webhook para reenviar la API Messages recibo de entrega a la aplicación Flask.

¿Qué es la tunelización?

En este tutorial, crearemos una aplicación web y la ejecutaremos localmente en tu máquina. Debido a que se ejecutará localmente, no se podrá acceder a ella desde la Internet pública, y si no se puede acceder a tu aplicación web, Vonage no podrá realizar una solicitud al webhook. Aquí es donde entra en juego la tunelización. Tunneling expone los servidores locales a la Internet pública a través de URL públicas temporales o estáticas. ngrok es una plataforma de software que brinda este servicio.

En resumen, crearemos una aplicación web Python Flask con un webhook y utilizaremos ngrok para que su aplicación local sea accesible a través de un túnel a una URL pública para que Vonage pueda realmente publicar en un status webhook.

Tutorial: Enviar mensajes SMS con Python, Flask y Vonage

En este tutorial, usaremos Flask para implementar una aplicación que envíe mensajes de texto y también defina un webhook. Usaremos ngrok para exponer el webhook a la internet pública para que Vonage pueda hacerle peticiones.

Si lo prefiere, puede desplegar el código para enviar un SMS desde GitHub de la comunidad de Vonage.

Requisitos previos

Para completar este tutorial, necesitarás lo siguiente:

Configuración del tutorial

Antes de empezar a construir, pongamos todo en orden.

Cree una Account en ngrok, instálelo y cree un túnel.

El Messages API debe ser capaz de acceder a su webhook para que pueda hacerle peticiones; por lo tanto, la URL del endpoint debe ser accesible a través de la Internet pública.

Una vez que tengas ngrok instalado, abre una ventana de terminal y ejecuta:

ngrok http 5000

Este comando generará las URL públicas a las que tu servidor local hará un túnel en el puerto 5000. Toma nota de la URL pública porque la usaremos cuando creemos nuestra aplicación de Vonage, debería verse así:

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

Tenga en cuenta lo siguiente: A menos que esté utilizando uno de los planes de pago de ngrok, las URL públicas generadas no son persistentes. En otras palabras, cada vez que ejecutes el comando ngrok las URL resultantes cambiarán y deberás actualizar la configuración de tu aplicación de Vonage. Para evitar esto, deja ngrok en ejecución mientras dure el tutorial.

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.

Dado que vamos a utilizar la API de Messages, también tendrá que configurar sus configuración de Account en consecuencia. En el panel de control para desarrolladores, en el menú de navegación de la izquierda, seleccione Configuración de la API. En la sección Configuración de SMS seleccione Mensajes API y siga las instrucciones para guardar los cambios.

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.Cree una aplicación Messages API y vincule su número a ella.

Primero debe crear una aplicación Messages API. La "aplicación" a la que nos referimos aquí es un contenedor para la configuración y la información de seguridad que necesitas para la Messages API. No es lo mismo que la aplicación web Flask que también vamos a crear.

Cree su aplicación Messages API en el panel del desarrollador accediendo a la sección Applications en el menú de la izquierda y haciendo clic en el botón Crear nueva aplicación . Se abrirá el menú de creación de aplicaciones. Dé a su aplicación el nombre send-sms.

En el marco de las Capacidades active la opción de Mensajesque mostrará una lista de campos de texto. En el campo de texto denominado URL de estadoproporciona la URL pública de ngrok modificada con el webhook que definiremos en la aplicación Flask. Esto será algo como https://0a6ec0a950eb.ngrok-free.app/webhooks/message-status.

Dado que en este tutorial no vamos a manejar mensajes entrantes, el campo URL de entrada no se utilizará. Sin embargo, la creación de una aplicación requiere una, por lo que puede proporcionar http://example.com/webhooks/inbound para satisfacer este requisito.

Haga clic en el botón "Generar nueva solicitud".

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.Ahora que ha creado su solicitud, puede vincular su número a ella haciendo clic en el botón Vincular en la tabla de Numbers disponibles. Asegúrate de seleccionar un número con funciones SMS y MMS.

Crear un directorio de proyecto

En una nueva ventana de terminal, ejecute lo siguiente para crear un nuevo directorio de proyecto y navegue hasta él:

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

¡Empecemos a construir!

Ahora que lo tienes todo preparado, es hora de empezar a construir.

Salte a la sección que desee haciendo clic en los pasos siguientes:

  1. Crear y activar un entorno virtual Python

  2. Instalar dependencias

  3. Genere y añada su ID de aplicación y clave privada a sus variables de entorno

  4. Escribir y ejecutar el código

  5. Pruébelo.

1. Crear y activar un entorno virtual Python

Los entornos virtuales de Python te permiten instalar paquetes en una ubicación aislada del resto de tu sistema. Esto ayuda a evitar el desorden en todo el sistema y los conflictos con diferentes versiones y paquetes de Python. Para obtener más información, consulta la entrada de nuestro blog sobre entornos virtuales.

En el directorio de su proyecto, ejecute los siguientes comandos para crear un entorno virtual y activar un entorno virtual:

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

Ahora debería ver en su terminal el prefijo (venv). Para desactivar su entorno virtual, ejecute el comando deactivate comando .

2. Instalar dependencias

Para instalar las dependencias que necesitamos para este tutorial, ejecute lo siguiente:

pip install vonage flask python-dotenv Jinja2 flask-socketio

3. Genere y añada su ID de aplicación y clave privada a sus variables de entorno

En el panel de control del desarrollador Aplicaciones menúhaga clic en la aplicación que ha creado para este tutorial y, a continuación, haga clic en Editar. Una vez que se abra la ventana de edición, haz clic en el botón que dice "Generar clave pública y privada". Esto activará la descarga de su clave privada como un archivo con la extensión .key. Mantén este archivo en privado y no lo compartas en ningún sitio donde pueda estar en peligro. Si planea publicar este código en algún lugar, asegúrese de añadir su archivo de clave privada a su archivo . .gitignore archivo.

Haga clic en el botón "Guardar cambios" y anote también su ID de solicitud.

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.Mueva su archivo de clave privada al directorio de su proyecto. En el mismo directorio, cree un archivo llamado .env y añade las siguientes variables:

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

También puede encontrar la en GitHub. Para obtener más información, consulte nuestra entrada del blog sobre variables de entorno.

4. Escribir y ejecutar el código

En este tutorial crearemos una aplicación Flask mínima que utiliza la API de mensajes para enviar un SMS a través de un formulario web. Para crear este formulario, necesitaremos:

  1. El código de la aplicación Python.

  2. Y una plantilla HTML para ser renderizada en un navegador.

El código de la aplicación Python

En el directorio de su proyecto, cree un archivo llamado app.py que incluya el siguiente código:

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)

Veamos lo que ocurre aquí.

La parte más importante del código es la send_sms y la función. Aquí es donde utilizamos la Messages API para enviar un SMS. En este ejemplo concreto, utilizamos un formulario en línea para proporcionar los detalles de nuestro mensaje y lanzar una solicitud a la Messages API. Una vez enviado el formulario, la aplicación redirige a una página delivery_receipt página.

El siguiente bloque al que hay que prestar atención es el message_status ruta y función. Este es el webhook que configuramos para la URL de estado en nuestra aplicación Mensajes en el panel del desarrollador. Aquí es donde Vonage enviará actualizaciones sobre el estado del mensaje enviado por la aplicación.

Normalmente, para actualizar el estado de un mensaje se utiliza una base de datos o un sondeo, pero como se trata de una aplicación de demostración mínima, vamos a utilizar WebSocket. WebSocket es un protocolo que permite la comunicación entre el servidor y el navegador. Tiene una ventaja sobre RESTful HTTP porque las comunicaciones son bidireccionales y en tiempo real. Esto permite al servidor notificar al cliente en cualquier momento en lugar de que el cliente sondee a intervalos regulares en busca de actualizaciones.

Este ejemplo concreto utiliza la socketio biblioteca para establecer un canal de comunicación. Estas actualizaciones de estado se reflejarán en la página de Recibo de Entrega - de esa manera, incluso si el mensaje falla debido a las regulaciones o de otra manera, usted será capaz de ver el estado y cualquier información adicional en tiempo real.

Plantillas HTML

En el directorio del proyecto, cree un directorio llamado templates. A templates es una convención de convención Flask: Flask está configurado para buscar un directorio templates cuando renderiza HTML para el frontend de una aplicación web.

En el directorio templates cree dos archivos index.html y delivery_receipt.html. Copie y pegue el código correspondiente del repositorio de GitHub.

Ahora tienes todo lo que necesitas para ejecutar el código. Para desplegar tu aplicación web localmente, ejecuta el siguiente comando desde el directorio raíz del proyecto:

flask run

Esto creará un servidor en http://127.0.0.1:5000. Navegue hasta esa ubicación en un navegador web, y debería ver algo como esto:

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. 5. ¡Pruébalo!

Rellene el formulario con el número de teléfono (con el prefijo del país) al que desea recibir un SMS, junto con el mensaje que desea enviar.

Según las regulaciones de SMS de tu región, recibirás un mensaje de texto desde tu número virtual de Vonage usando la información que proporcionaste en el formulario. Sin embargo, debido a que las regulaciones de diferentes países pueden restringir el envío de un SMS desde un número virtual de Vonage, independientemente de si el mensaje tiene éxito o no, la aplicación Flask producirá un recibo de entrega en tiempo real de 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.Ten en cuenta: Debido a las diferentes regulaciones de SMS en todo el mundo, es posible que recibas un código de error de Vonage al intentar enviar un SMS desde un número virtual de Vonage. Puedes ver los registros en el panel del desarrollador seleccionando Registros en la barra de navegación de la izquierda. Para obtener más información sobre la normativa de SMS, especialmente si utilizas un número estadounidense de 10 dígitos, consulta esta entrada del blog sobre lo que necesitas saber sobre 10DLC.

En resumen

Este tutorial te guiará a través del proceso de envío de mensajes SMS utilizando Python, Flask y la API de Messages API de Vonage. Los SMS siguen desempeñando un papel crucial en diversas aplicaciones, desde las alertas hasta la autenticación, y esta guía proporciona un enfoque práctico para crear una aplicación web habilitada para SMS.

Has aprendido a configurar una aplicación Flask, integrar la API de Vonage y utilizar ngrok para exponer tu servidor local a Internet, lo que permite capacidades de mensajería en tiempo real. El tutorial cubrió componentes esenciales como configuraciones de API, manejo de webhook para actualizaciones de estado de mensajes y la creación de un formulario web fácil de usar para enviar SMS.

Además, se destacó la comprensión de las regulaciones de SMS y sus implicaciones para garantizar prácticas de mensajería conformes y explicar por qué Vonage puede no ser capaz de enviar un mensaje. Si bien esta restricción puede significar que tu aplicación no sea completamente funcional, al menos tienes una base sobre la cual construir, así como una comprensión fundamental de Messages API. A partir de aquí, puedes seguir explorando la API y otros canales de mensajería para aprovechar la comunicación de texto para tus necesidades comerciales.

Otras lecturas y recursos de referencia

¿Tienes alguna pregunta o algo que compartir? Únete a la conversación en Slack de la comunidad de Vonagey mantente actualizado con el Boletín para desarrolladoressíguenos en X (antes Twitter)suscríbete a nuestro canal de YouTube para ver tutoriales en video, y sigue la página de página para desarrolladores de Vonage en LinkedInun espacio para que los desarrolladores aprendan y se conecten con la comunidad. Mantente conectado, comparte tu progreso y entérate de las últimas noticias, consejos y eventos para desarrolladores.

Compartir:

https://a.storyblok.com/f/270183/400x400/2c4345217d/liz-acosta.jpeg
Liz AcostaDefensor del Desarrollador

Liz Acosta es promotora de desarrolladores en Vonage. Aunque su trayectoria profesional, de estudiante de cine a comercializadora, de ingeniera a defensora de los desarrolladores, puede parecer poco convencional, ¡es bastante típica de las relaciones con los desarrolladores! A Liz le encanta la pizza, las plantas, los carlinos y Python.