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

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

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

Начать курс

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

Rust — это современный системный язык программирования, который сочетает в себе высокую производительность и безопасность памяти. Несмотря на то, что экосистема Rust моложе, чем у Python или JavaScript, в ней уже есть все необходимые инструменты для интеграции с SMS-сервисами. В этой статье мы рассмотрим, как отправлять SMS-сообщения из Rust-приложений с помощью популярных API и библиотек.

Основные подходы к отправке SMS

Существует два основных способа отправки SMS из Rust:

  • Использование HTTP-клиента — прямой вызов REST API SMS-провайдера (Twilio, Vonage, SMS-Центр и др.)
  • Использование специализированных крейтов — готовых библиотек, которые оборачивают API провайдера в удобный Rust-интерфейс

Вариант 1: Отправка SMS через Twilio API

Twilio — один из самых популярных сервисов для отправки SMS. Для работы с ним вам понадобятся reqwest (HTTP-клиент) и serde (сериализация/десериализация JSON).

// Cargo.toml
[dependencies]
reqwest = { version = "0.12", features = ["json"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "1", features = ["full"] }

// main.rs
use reqwest::Client;
use serde::{Deserialize, Serialize};

#[derive(Serialize)]
struct TwilioSmsRequest {
    To: String,
    From: String,
    Body: String,
}

#[derive(Deserialize, Debug)]
struct TwilioSmsResponse {
    sid: String,
    status: String,
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let account_sid = "YOUR_TWILIO_ACCOUNT_SID";
    let auth_token = "YOUR_TWILIO_AUTH_TOKEN";
    let from_number = "+1234567890"; // Номер, купленный в Twilio
    let to_number = "+0987654321";

    let client = Client::new();
    let url = format!("https://api.twilio.com/2010-04-01/Accounts/{}/Messages.json", account_sid);

    let request_body = TwilioSmsRequest {
        To: to_number.to_string(),
        From: from_number.to_string(),
        Body: "Привет из Rust!".to_string(),
    };

    let response = client
        .post(&url)
        .basic_auth(account_sid, Some(auth_token))
        .form(&request_body)
        .send()
        .await?;

    let sms_response: TwilioSmsResponse = response.json().await?;
    println!("SMS отправлено! SID: {}, Статус: {}", sms_response.sid, sms_response.status);

    Ok(())
}

Вариант 2: Использование крейта twilio

Для более удобной работы с Twilio существует специализированный крейт twilio. Он предоставляет типизированный API и автоматически обрабатывает авторизацию.

// Cargo.toml
[dependencies]
twilio = "0.5"
tokio = { version = "1", features = ["full"] }

// main.rs
use twilio::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new(
        "YOUR_TWILIO_ACCOUNT_SID",
        "YOUR_TWILIO_AUTH_TOKEN"
    );

    let message = client
        .send_message("+1234567890", "+0987654321", "Hello from Rust!")
        .await?;

    println!("Сообщение отправлено! SID: {}", message.sid);
    Ok(())
}

Вариант 3: Отправка SMS через Vonage (Nexmo)

Vonage (ранее Nexmo) — еще один популярный провайдер. Для работы с ним можно использовать крейт vonage.

// Cargo.toml
[dependencies]
vonage = "0.2"
tokio = { version = "1", features = ["full"] }

// main.rs
use vonage::VonageClient;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = VonageClient::new(
        "YOUR_VONAGE_API_KEY",
        "YOUR_VONAGE_API_SECRET"
    );

    let response = client
        .send_sms("VonageAPI", "79001234567", "Привет из Rust!")
        .await?;

    println!("Статус: {:?}", response.messages[0].status);
    Ok(())
}

Вариант 4: Универсальный HTTP-клиент для любого провайдера

Если ваш SMS-провайдер не имеет готового крейта, вы всегда можете написать универсальный HTTP-запрос. Ниже пример для абстрактного API.

use reqwest::Client;
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::                    

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