Envío de SMS en Go (Golang): resumen de bibliotecas API y ejemplos de implementación
El envío de mensajes SMS es una de las funciones clave de las aplicaciones web modernas: desde la autenticación de dos factores hasta las notificaciones de estado de pedidos. En el ecosistema de Go (Golang) existen varias bibliotecas maduras que permiten integrar el envío de SMS a través de pasarelas populares (Twilio, Vonage, Clickatell, proveedores rusos). En este artículo, analizaremos en detalle cómo configurar el envío de SMS en Go, utilizando las mejores prácticas y las API oficiales.
¿Por qué Go para el envío de SMS?
Go es un lenguaje compilado con excelente soporte para concurrencia, lo que lo hace ideal para el envío asíncrono de grandes cantidades de mensajes. Gracias a las goroutines y canales integrados, puede procesar miles de solicitudes SMS sin bloquear el hilo principal. Además, la biblioteca estándar net/http permite trabajar fácilmente con las API REST de cualquier proveedor de SMS.
Bibliotecas principales para trabajar con SMS en Go
- twilio-go — cliente oficial para Twilio (el servicio internacional más popular). Admite SMS, MMS y llamadas de voz.
- vonage-go (anteriormente Nexmo) — cliente para la API de Vonage.
- go-sms — biblioteca universal con soporte para múltiples proveedores (SMS.ru, Twilio, Clickatell).
- gosms — envoltorio simple para solicitudes HTTP a cualquier pasarela SMS.
Instalación de la biblioteca
Como ejemplo, usaremos el cliente oficial de Twilio. Instale el paquete mediante go get:
go get github.com/twilio/twilio-goPara el proveedor ruso SMS.ru también hay una biblioteca conveniente:
go get github.com/smsru/smsru-goEjemplo básico: envío de SMS a través de Twilio
Antes de comenzar, obtenga el Account SID y el Auth Token desde la consola de Twilio. A continuación, el código mínimo funcional:
package main
import ( "fmt" "os"
"github.com/twilio/twilio-go" openapi "github.com/twilio/twilio-go/rest/api/v2010")
func main() { // Inicialización del cliente client := twilio.NewRestClientWithParams(twilio.ClientParams{ Username: os.Getenv("TWILIO_ACCOUNT_SID"), Password: os.Getenv("TWILIO_AUTH_TOKEN"), })
// Parámetros del mensaje params := &openapi.CreateMessageParams{} params.SetTo("+1234567890") // número del destinatario params.SetFrom("+0987654321") // su número de Twilio params.SetBody("¡Hola! ¡Este es un SMS de prueba desde Go!")
// Envío resp, err := client.Api.CreateMessage(params) if err != nil { fmt.Println("Error al enviar:", err) return }
fmt.Println("¡SMS enviado! SID:", *resp.Sid)}Envío de SMS a través de una pasarela rusa (SMS.ru)
Para la integración con SMS.ru, use la biblioteca smsru-go. El código se verá así:
package main
import ( "fmt" "os"
"github.com/smsru/smsru-go")
func main() { // Creación del cliente con clave API client := smsru.NewClient(os.Getenv("SMSRU_API_KEY"))
// Envío de un solo mensaje result, err := client.SendSMS("+79991234567", "¡Hola! ¡Esto es una prueba desde Go!") if err != nil { fmt.Println("Error:", err) return }
if result.Status == "OK" { fmt.Println("¡SMS enviado! ID:", result.SmsID) } else { fmt.Println("Error:", result.StatusText) }}Envío asíncrono usando goroutines
Una de las principales ventajas de Go es la facilidad para enviar SMS en paralelo. Ejemplo de envío masivo:
package main
import ( "fmt" "sync")
func sendSMSAsync(client *smsru.Client, phone, message string, wg *sync.WaitGroup) { defer wg.Done() resul