Отправка 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 и обработ
Также в библиотеке
Генерация PDF-отчётов на Swift для iOS и macOS с PDFKit и Core Graphics
Работа с Markdown в Go (Golang): библиотеки, парсинг и конвертация
kotlinx-datetime для Kotlin: полное руководство с примерами
Валидация данных в Swift: библиотека Validator