Evita enviar SMS a líneas fijas en Rust con la API de Lookup v2 de Twilio

April 22, 2026
Redactado por
Revisado por

Evita enviar SMS a líneas fijas con la API de Lookup v2 y Rust

Tienes una app web superexitosa con tecnología Rust, a la que recientemente agregaste soporte de notificación por SMS. Te complace compartir la nueva funcionalidad con tus usuarios y llevarla a producción.

Lamentablemente, a medida que tu aplicación comienza a notificar a los usuarios con tus mensajes de texto bellamente elaborados, comienzas a recibir errores intermitentes, que dicen:

Entrega de mensajes: línea fija u operador móvil inaccesible.

Poco después de esto, comienzas a recibir solicitudes de soporte intermitentes de los usuarios que preguntan por qué no reciben notificaciones. ¿Qué está pasando?

Resulta que tu aplicación no filtra números de línea fija (línea fija) antes de enviarles notificaciones por SMS.

Entonces, ¿qué puedes hacer? ¿Cómo puedes capturar mensajes no entregables de manera proactiva? Mejor aún, ¿cómo puedes filtrar las líneas fijas de una lista de números de teléfono antes de enviarles mensajes y evitar que se les cobre por SMS fallidos?

Esta publicación de blog te guiará a través de cómo hacerlo en Rust mediante la API de Lookup v2 de Twilio.

Requisitos previos

Necesitarás lo siguiente para utilizar la aplicación:

  • Una cuenta de Twilio (gratuita o pagada). Crear una cuenta si aún no tienes una.
  • Rust y Cargo. Sigue los documentos de instalación si aún no los has instalado.
  • Uno o más números de teléfono que te gustaría validar donde al menos uno es una línea fija; idealmente el tuyo o el de personas que conoces
  • Tu editor de código preferido o IDE, como neovim o Visual Studio Code
  • Cierta experiencia terminal es útil, aunque no es necesaria

Crea un nuevo proyecto de Rust

Lo primero que debes hacer es iniciar un nuevo proyecto binario de Rust con Cargo, ejecutando el siguiente comando:

cargo new filter-landlines-with-rust --bin
cd filter-landlines-with-rust

Agrega los crates requeridos

Al igual que cualquier proyecto bueno más grande que "hola, mundo", la aplicación deberá utilizar una serie de crates para simplificar su creación. No hay muchos:

  • anyhow: este crate proporciona un tipo de error concreto flexible
  • dotenv: este crate carga variables de entorno desde un archivo .env, ideal para entornos de desarrollo y pruebas
  • reqwest: este crate proporciona un potente cliente HTTP
  • rustlio: este crate simplifica la interacción con las API de Twilio en aplicaciones Rust

Para agregarlos al proyecto, ejecuta el siguiente comando:

cargo add \
    anyhow \
    dotenvy \
    rustlio \
    reqwest --features reqwest/blocking --features reqwest/json
He dividido el comando anterior en varias líneas para mejorar su legibilidad. Si estás utilizando Microsoft Windows, recuerda reemplazar la barra invertida con un signo de intercalación (^).

Establece las variables de entorno requeridas

Lo siguiente que se debe hacer es establecer dos variables de entorno, necesarias para realizar solicitudes autenticadas a la API de Lookup v2 de Twilio.

Configúralas en un archivo llamado .env y cárgalas utilizando el crate dotenv. En el directorio de nivel superior del proyecto, crea un nuevo archivo llamado .env y pega la siguiente configuración en el archivo.

TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=

Luego, abre Twilio Console en el navegador que elijas y copia el SID de la cuenta y el Token de autenticación desde la Información de la cuenta, como puedes ver en la captura de pantalla a continuación.

Screenshot of Twilio console displaying account SID, auth token, and phone number.

Ahora, establece los valores copiados como los valores de TWILIO_ACCOUNT_SID y TWILIO_AUTH_TOKEN respectivamente, en .env.

Como alternativa, puedes establecer las variables de entorno cuando ejecutas el código o pasarlas como argumentos de línea de comandos a la aplicación. Lo que prefieras.

Actualiza la aplicación principal

Ahora, es momento de escribir el código central, del cual no hay tanto. Reemplaza el código existente en src/main.rs con el código en el siguiente bloque.

Luego, reemplaza <YOUR PHONE NUMBERS> en el código anterior con una lista separada por comas de literales de cadena. Estos son los números de teléfono en formato E.164 que deseas verificar con la API de Lookup v2, p. ej., "+614912345678", "+61402987654". Asegúrate de que al menos uno sea una línea fija.

use anyhow::Result;
use rustlio::twilio::lookup;
use std::env;

fn main() -> Result<()> {
    dotenvy::dotenv()?;
    let user = env::var("TWILIO_ACCOUNT_SID")?;
    let pass = env::var("TWILIO_AUTH_TOKEN")?;
    let client = reqwest::blocking::Client::new();

    let phone_number_list = vec!["<YOUR PHONE NUMBERS>"];
    let non_landlines: Vec<&str> = phone_number_list
        .into_iter()
        .filter(|number| {
            let data = lookup::lookup_phone_data_with_line_type(
                number, 
                &client, 
                &user, 
                &pass
            );
            let phone_number = data.unwrap_or_default();
            phone_number.get_line_type() != "landline"
        })
        .collect::<Vec<&str>>();

    if non_landlines.is_empty() {
        println!("No non-landlines are available.");
    } else {
        println!("Available phone numbers: {:?}", non_landlines);
    }
    Ok(())
}

El código comienza cargando tus credenciales de Twilio (user y pass) desde .env. Luego, crea una instancia de un cliente de Reqwest de bloqueo para realizar la solicitud a la API de Lookup e inicia un vector de números de teléfono para verificar.

Utilicé deliberadamente un cliente de bloqueo en este tutorial, ya que es un ejemplo simplista. En una aplicación de producción, es probable que utilices un cliente asíncrono para una mejor respuesta.

Ahora viene la parte divertida. Se crea un iterador a partir de los números de teléfono en phone_number_list con into_iter(). Luego, esto se filtra solo a aquellos números que no son líneas fijas con la función de filter. Si no estás familiarizado con la función:

Crea un iterador que utiliza un cierre para determinar si se debe producir un elemento. Dado un elemento, el cierre debe devolver verdadero o falso. El iterador devuelto producirá solo los elementos para los que el cierre devuelve verdadero.

Por lo tanto, para cada número de teléfono, el cierre proporcionado:

  1. Intenta recuperar los detalles del número de teléfono junto con la información de Line Type Intelligence de la API de Lookup v2, llamando a lookup_phone_data_with_line_type
  2. Si los detalles del número de teléfono están disponibles, se devuelve una estructura PhoneNumber completamente poblada; de lo contrario, se devuelve una vacía/predeterminada
  3. Si el tipo de línea del número de teléfono devuelto está configurado como "landline", se filtra del iterador devuelto

El iterador devuelto desde filter() luego se transforma en un vector con collect(). Por último, los números de teléfono restantes se imprimen en la terminal.

No incluí ningún código de envío de SMS, ya que el enfoque del tutorial está en cómo filtrar las líneas fijas de una lista de números de teléfono. Para enviar un SMS con Rust mediante Twilio, consulta este tutorial en el blog de Twilio.

Prueba que funciona como se espera

Ahora que el código está escrito, es hora de probar que funciona como se espera. Para hacerlo, ejecútalo con el siguiente comando.

cargo run

Después de que el código se compila y ejecuta, debes ver la salida, similar a la siguiente, impresa en la terminal.

Available phone numbers: ["+614912345678", "+61402987654"]

Así es como se evita enviar SMS a teléfonos fijos con la API de Lookup v2 de Twilio y Rust

Gracias al poder de la biblioteca estándar de Rust y la API de Lookup v2 de Twilio, puedes evitar enviar SMS a teléfonos fijos en tus aplicaciones de Rust. Ahora, puedes evitar que se te cobre por SMS fallidos y ofrecer a tus usuarios una mejor experiencia en todos los sentidos.

¿Quieres ir más lejos?

Si deseas obtener más información sobre cómo puedes utilizar Rust con Twilio, consulta los siguientes tutoriales:

Matthew Setter es editor de PHP, Go y Rust en el equipo de Twilio Voices y desarrollador en cada uno de estos lenguajes. También es autor de Mezzio Essentials y Deploy with Docker Compose. Puedes encontrarlo en msetter[arroba]twilio.com y en LinkedIn y GitHub.

Freepik creó el ícono del teléfono en Flaticon, y la superlindo cangrejo Ferris proviene de rustacean.net.

Resumen generado por IA
  • Filtra los números de línea fija antes de enviar SMS para evitar errores.
  • Configura un proyecto Rust y utiliza la API de Lookup v2 de Twilio para verificar los tipos de números de teléfono.
  • Evita enviar mensajes no entregables mediante el uso de credenciales de Twilio.

Este resumen fue generado por IA.