# Отправка SMS через Python: пошаговый гайд с примерами

- Опубликовано: 2026-05-19T18:49:47+00:00
- Обновлено: 2026-05-19T18:49:47+00:00
- Автор: Зинаида Прохорова
- Канонический URL: https://smsblog.ru/tarify-i-ceny/otpravka-sms-cherez-python-poshagovyy-gayd-s-primerami/

Для отправки SMS через Python понадобится API‑провайдер, библиотека `requests` и настройка авторизации. Ниже приведён практический пример, который можно быстро внедрить в проект.

## Как выбрать подходящего SMS‑провайдера?

Выбор начинается с критериев: наличие REST‑API, поддержка JSON, тарифы, покрытие стран. В 2026 г. популярными являются Twilio, Plivo, и локальные провайдеры с открытым API, например полное руководство. Проверь лимиты на количество сообщений и наличие библиотек для Python.

### Ключевые параметры сравнения

| Параметр | Twilio | Plivo | Локальный провайдер |
| --- | --- | --- | --- |
| Код авторизации | Basic Auth | Basic Auth | OAuth 2.0 |
| Формат payload | JSON | JSON | SOAP/JSON |
| Тарифы | 0,07 $ / сообщение | 0,05 $ / сообщение | 0,02 $ / сообщение |

## Установка и базовая конфигурация

Установите библиотеку `requests`:

```
pip install requests
```

Сохраните учётные данные в переменных окружения для безопасности.

## Отправка SMS через REST‑API

Ниже пример использования Twilio API. Аналогично работает и любой другой провайдер, заменив URL и параметры.

```
import os
import requests

api_url = "https://api.twilio.com/2010-04-01/Accounts/{account_sid}/Messages.json"
account_sid = os.getenv("TWILIO_SID")
auth_token = os.getenv("TWILIO_TOKEN")

payload = {
    "From": "+1234567890",
    "To": "+998123456789",
    "Body": "Привет! Это тестовое сообщение"
}

response = requests.post(api_url.format(account_sid=account_sid), data=payload, auth=(account_sid, auth_token))
print(response.status_code)
print(response.json())
```

Ответ сервера содержит поля `sid`, `status` и `error_message` при ошибке.

### Обработка ошибок и статусных кодов

Смотрите [справочник](http://smsblog.ru/sms-rassylki/obrabotka-otvetov-servera-i-kody-oshibok-sms-shlyuza-spravochnik-dlya/) для полного списка кодов.

## Батч‑рассылка и очереди

Для больших объёмов используйте очередь (Redis, RabbitMQ) и worker‑процессы. Чтение списка номеров из CSV:

```
import csv

def load_numbers(file_path):
    with open(file_path, newline='') as f:
        reader = csv.DictReader(f)
        return [row["phone"] for row in reader]
```

Worker может отправлять сообщение, проверять статус и обновлять базу.

## Локализация и ограничения по символам

SMS ограничена 160 символами для GSM и 70 для UTF‑8. Автоматически разбивайте длинные сообщения:

```
def split_message(text, max_len=160):
    return [text[i:i+max_len] for i in range(0, len(text), max_len)]
```

## Факторы стоимости и оптимизации

Стоимость зависит от страны, типа номера и объёма. Планируйте рассылку по плану “batch” – разбейте на группы, чтобы избежать лимитов и снизить нагрузку.

## Безопасность и GDPR

Никогда не храните номера в открытом виде. Храните их в зашифрованном виде и используйте `OAuth` для доступа к API, как описано в [статье](http://smsblog.ru/biznes-kommunikacii/avtorizatsiya-i-bezopasnost-v-sms-api-klyuchi-oauth-i-tokeny/).

## FAQ

- **Как быстро тестировать SMS‑API без реальных номеров?** Используйте тестовые номера, предоставляемые провайдером, либо сервисы типа [смс‑шлюз](http://smsblog.ru/tarify-i-ceny/integratsiya-sms-api-s-populyarnymi-yazykami-programmirovaniya-poshago/).
- **Можно ли использовать Python‑библиотеку `smsapi`?** Да, но она не поддерживает OAuth. Для современных требований лучше REST‑API.
- **Сколько ошибок чаще всего встречается?** Чаще всего 400‑показывают неверный формат номера, 401 – неверные токены, 429 – превышение лимита.
- **Как интегрировать SMS в маркетинговую кампанию?** Создайте таблицу с сегментами, отправьте тест, измерьте коэффициент отклика и масштабируйте.

## Источники

- В материале не указаны внешние источники.
