Отправка 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();
}