Отправка 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%!", &