Отправка SMS на C# (.NET): Интеграция с API SMS-сервисов

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

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

Начать курс

Отправка SMS на C# (.NET): Полное руководство по интеграции с API

В современном мире SMS-уведомления остаются одним из самых надёжных способов связи с пользователем. В экосистеме C# (.NET) существует множество подходов к отправке сообщений — от прямых HTTP-запросов до использования специализированных NuGet-пакетов. В этой статье мы разберём, как настроить отправку SMS через популярные сервисы (Twilio, sms.ru, Smsc) на примере чистой реализации на HttpClient, а также рассмотрим готовую библиотеку для работы с российскими провайдерами.

Выбор подхода: библиотека или чистый HTTP?

Для отправки SMS в C# есть два основных пути:

  • Использование официального SDK (например, Twilio для .NET) — даёт типизированный интерфейс, встроенную обработку ошибок и документацию.
  • Прямая работа с REST API через HttpClient — полный контроль над запросом, минимальные зависимости, возможность работать с любым провайдером.

Второй вариант предпочтительнее для образовательных целей и проектов, где требуется гибкость. Рассмотрим его детально.

Базовая реализация отправки SMS через HTTP API

Создадим класс SmsService, который будет отправлять сообщения через API sms.ru (или любого другого сервиса с похожим форматом).

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class SmsService
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;

    public SmsService(string apiKey)
    {
        _httpClient = new HttpClient();
        _apiKey = apiKey;
    }

    public async Task<string> SendSmsAsync(string phone, string message)
    {
        var url = $"https://sms.ru/sms/send?api_id={_apiKey}&to={phone}&msg={Uri.EscapeDataString(message)}&json=1";
        var response = await _httpClient.GetAsync(url);
        return await response.Content.ReadAsStringAsync();
    }
}

Использование:

var sms = new SmsService("ВАШ_API_КЛЮЧ");
string result = await sms.SendSmsAsync("+79123456789", "Привет! Это тестовое сообщение.");
Console.WriteLine(result);

Оптимизация: асинхронность и обработка ошибок

В реальном проекте необходимо добавить валидацию номера, повторные попытки при сбоях и логирование. Улучшенная версия:

public async Task<SmsResult> SendSmsAsync(string phone, string message)
{
    try
    {
        if (string.IsNullOrWhiteSpace(phone) || phone.Length < 10)
            return new SmsResult { Success = false, Error = "Неверный формат номера" };

        var url = $"https://sms.ru/sms/send?api_id={_apiKey}&to={phone}&msg={Uri.EscapeDataString(message)}&json=1";
        var response = await _httpClient.GetAsync(url);
        var json = await response.Content.ReadAsStringAsync();

        // Парсинг JSON (можно использовать System.Text.Json)
        var result = JsonSerializer.Deserialize<SmsApiResponse>(json);
        return new SmsResult { Success = result?.Status == "OK", Response = json };
    }
    catch (HttpRequestException ex)
    {
        return new SmsResult { Success = false, Error = $"Ошибка сети: {ex.Message}" };
    }
}

Для парсинга ответа создайте простую модель:

public class SmsApiResponse
{
    public string Status { get; set; }
    public int Balance { get; set; }
}

Готовая библиотека: Twilio для .NET

Если вам нужна production-готовность, используйте Twilio SDK (NuGet: Twilio). Пример:

using Twilio;
using Twilio.Rest.Api.V2010.Account;

TwilioClient.Init("ACCOUNT_SID", "AUTH_TOKEN");

var message = MessageResource.Create(
    body: "Привет от C#!",
    from: new PhoneNumber("+1234567890"),
    to: new PhoneNumber("+79123456789")
);

Console.WriteLine(message.Sid);

Работа с российскими провайдерами (Smsc, sms.ru)

Для локальных сервисов удобно написать обёртку. Ниже — пример отправки POST-запросом с авторизацией через логин и пароль (Smsc):

public async Task<string> SendViaSmsc(string login, string password, string phone, string msg)
{
    var data = new Dictionary<string, string>
    {
        ["login"] = login,
        ["psw"] = password,
        ["phones"] = phone,
        ["mes"] = msg,
        ["fmt"] = "3" // JSON-формат
    };

    using var httpClient = new HttpClient();
    var content = new FormUrlEncodedContent(data);
    var response = await httpClient.PostAsync("https://smsc.ru/sys/send.php", content);
    return await response.Content.ReadAsStringAsync();
}

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