Отправка SMS на Rust: RustSMS — API библиотека для работы с SMS-шлюзами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка SMS на Rust: Обзор библиотеки RustSMS

В современном мире веб-разработки и автоматизации отправка SMS-сообщений остаётся востребованной задачей: от двухфакторной аутентификации до уведомлений о статусе заказа. Если вы пишете на Rust и ищете надёжный способ интеграции с SMS-провайдерами, библиотека RustSMS — это то, что вам нужно. Она предоставляет единый, асинхронный и типобезопасный API для работы с десятками SMS-шлюзов (Twilio, Vonage, Clickatell, SMS.ru и другими).

В этой статье мы разберём ключевые возможности RustSMS, покажем примеры кода и расскажем, как начать отправлять сообщения за несколько минут.

Основные возможности RustSMS

  • Единый интерфейс — независимо от выбранного провайдера, вы используете один и тот же набор методов.
  • Асинхронность — библиотека построена на tokio и reqwest, что позволяет не блокировать основной поток.
  • Поддержка популярных шлюзов — Twilio, Vonage (Nexmo), Clickatell, SMS.ru, MessageBird и другие.
  • Типобезопасные конфигурации — все параметры (номер, текст, провайдер) проверяются на этапе компиляции.
  • Лёгкое расширение — вы можете написать свой адаптер для любого кастомного шлюза.

Установка

Добавьте зависимость в ваш Cargo.toml:

[dependencies]
rustsms = "0.5"
tokio = { version = "1", features = ["full"] }

Базовый пример отправки SMS

Перед отправкой необходимо создать конфигурацию для выбранного провайдера. Рассмотрим пример с Twilio:

use rustsms::{SmsClient, providers::twilio::TwilioConfig};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box> {
    // Создаём конфигурацию для Twilio
    let config = TwilioConfig::new(
        "YOUR_ACCOUNT_SID",
        "YOUR_AUTH_TOKEN",
        "+1234567890", // ваш номер отправителя
    );

    // Инициализируем клиент
    let client = SmsClient::new(config);

    // Отправляем сообщение
    let response = client
        .send("+0987654321", "Привет из Rust!")
        .await?;

    println!("SMS отправлено! ID: {}", response.message_id);
    Ok(())
}

Работа с несколькими провайдерами

RustSMS позволяет легко переключаться между провайдерами. Для этого нужно лишь изменить конфигурацию:

use rustsms::{SmsClient, providers::vonage::VonageConfig};

let config = VonageConfig::new(
    "YOUR_API_KEY",
    "YOUR_API_SECRET",
    "RustSMS",
);
let client = SmsClient::new(config);

Обработка ошибок и статусов

Библиотека возвращает подробные ошибки, если что-то пошло не так. Вы можете обработать их с помощью паттерн-матчинга:

match client.send("+1111111111", "Тест").await {
    Ok(response) => println!("Успех: {:?}", response),
    Err(e) => match e {
        rustsms::Error::Api { code, message } => {
            eprintln!("Ошибка API {}: {}", code, message);
        }
        rustsms::Error::Network(e) => {
            eprintln!("Сетевая ошибка: {}", e);
        }
        _ => eprintln!("Неизвестная ошибка"),
    },
}

Расширенные возможности: шаблоны и кастомные заголовки

RustSMS поддерживает отправку сообщений с использованием шаблонов (например, для OTP-кодов) и кастомных HTTP-заголовков. Пример с шаблоном:

let otp_code = 123456;
let message = format!("Ваш код подтверждения: {}", otp_code);
client
    .send("+1111111111", &message)
    .await?;

Для более сложных сценариев (например, отправка через SMS-шлюз с дополнительными параметрами) вы можете использовать метод send_with_opts:

use rustsms::options::SendOptions;

let opts = SendOptions::new()
    .with_callback_url("https://example.com/sms-status")
    .with_validity_period(3600); // 1 час

client.send_with_opts("+1111111111", "Важный текст", opts).await?;

Сравнение с другими решениями

  • RustSMS vs ручной HTTP-запрос — библиотека скрывает детали аутентификации, сериализации/десериализации JSON и обработ

Рекомендаций