Отправка SMS на Go (Golang): API библиотека

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

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

Начать курс

Отправка SMS на Go (Golang): обзор API библиотек и примеры реализации

Отправка SMS-сообщений — одна из ключевых функций современных веб-приложений: от двухфакторной аутентификации до уведомлений о статусе заказа. В экосистеме Go (Golang) существует несколько зрелых библиотек, которые позволяют интегрировать отправку SMS через популярные шлюзы (Twilio, Vonage, Clickatell, российские провайдеры). В этой статье мы подробно разберём, как настроить отправку SMS на Go, используя лучшие практики и официальные API.

Почему Go для отправки SMS?

Go — компилируемый язык с отличной поддержкой конкурентности, что идеально подходит для асинхронной отправки большого количества сообщений. Благодаря встроенным goroutines и каналам, вы можете обрабатывать тысячи SMS-запросов без блокировки основного потока. Кроме того, стандартная библиотека net/http позволяет легко работать с REST API любых SMS-провайдеров.

Основные библиотеки для работы с SMS в Go

  • twilio-go — официальный клиент для Twilio (самый популярный международный сервис). Поддерживает SMS, MMS, голосовые вызовы.
  • vonage-go (бывший Nexmo) — клиент для Vonage API.
  • go-sms — универсальная библиотека с поддержкой нескольких провайдеров (SMS.ru, Twilio, Clickatell).
  • gosms — простая обёртка для HTTP-запросов к любому SMS-шлюзу.

Установка библиотеки

Для примера будем использовать официальный клиент Twilio. Установите пакет через go get:

go get github.com/twilio/twilio-go

Для российского провайдера SMS.ru также есть удобная библиотека:

go get github.com/smsru/smsru-go

Базовый пример: отправка SMS через Twilio

Перед началом работы получите Account SID и Auth Token из консоли Twilio. Ниже — минимальный рабочий код:

package main

import (
    "fmt"
    "os"

    "github.com/twilio/twilio-go"
    openapi "github.com/twilio/twilio-go/rest/api/v2010"
)

func main() {
    // Инициализация клиента
    client := twilio.NewRestClientWithParams(twilio.ClientParams{
        Username: os.Getenv("TWILIO_ACCOUNT_SID"),
        Password: os.Getenv("TWILIO_AUTH_TOKEN"),
    })

    // Параметры сообщения
    params := &openapi.CreateMessageParams{}
    params.SetTo("+1234567890")       // номер получателя
    params.SetFrom("+0987654321")     // ваш номер Twilio
    params.SetBody("Привет! Это тестовое SMS из Go!")

    // Отправка
    resp, err := client.Api.CreateMessage(params)
    if err != nil {
        fmt.Println("Ошибка отправки:", err)
        return
    }

    fmt.Println("SMS отправлено! SID:", *resp.Sid)
}

Отправка SMS через российский шлюз (SMS.ru)

Для интеграции с SMS.ru используйте библиотеку smsru-go. Код будет выглядеть так:

package main

import (
    "fmt"
    "os"

    "github.com/smsru/smsru-go"
)

func main() {
    // Создание клиента с API-ключом
    client := smsru.NewClient(os.Getenv("SMSRU_API_KEY"))

    // Отправка одного сообщения
    result, err := client.SendSMS("+79991234567", "Привет! Это тест из Go!")
    if err != nil {
        fmt.Println("Ошибка:", err)
        return
    }

    if result.Status == "OK" {
        fmt.Println("SMS отправлено! ID:", result.SmsID)
    } else {
        fmt.Println("Ошибка:", result.StatusText)
    }
}

Асинхронная отправка с использованием goroutines

Одно из главных преимуществ Go — возможность легко отправлять SMS параллельно. Пример массовой рассылки:

package main

import (
    "fmt"
    "sync"
)

func sendSMSAsync(client *smsru.Client, phone, message string, wg *sync.WaitGroup) {
    defer wg.Done()
    result, err := client.SendSMS(phone, message)
    if err != nil {
        fmt.Printf("Ошибка для %s: %v\n", phone, err)
        return
    }
    fmt.Printf("Отправлено на %s: статус %s\n", phone, result.Status)
}

func main() {
    client := smsru.NewClient("ваш_api_ключ")
    phones := []string{"+79991111111", "+79992222222", "+79993333333"}
    var wg sync.WaitGroup

    for _, phone := range phones {
        wg.Add(1)
        go sendSMSAsync(client, phone, "Акция! Скидка 50%!", &                    

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