Envio de email em Go (Golang): visão geral de bibliotecas e ferramentas
Go (Golang) é uma linguagem compilada moderna, ideal para criar serviços de backend, microsserviços e automação. Uma das tarefas comuns é o envio programático de emails. Neste artigo, abordaremos detalhadamente os recursos padrão do Go para trabalhar com SMTP, bibliotecas de terceiros populares, além de exemplos de envio de emails simples e HTML com anexos.
Pacote padrão net/smtp
Na biblioteca padrão do Go, existe o pacote net/smtp, que oferece funcionalidades básicas para envio de email via servidor SMTP. Ele é simples, mas exige a montagem manual do corpo do email (incluindo cabeçalhos e tipos MIME).
Exemplo simples de envio de email de texto
package main
import ( "fmt" "net/smtp")
func main() { // Dados de autenticação from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// Servidor SMTP (exemplo: Gmail) smtpHost := "smtp.gmail.com" smtpPort := "587"
// Corpo do email (obrigatório com cabeçalhos) subject := "Subject: Olá do Go!" body := "Este é um email de teste enviado com net/smtp." message := []byte(subject + "" + body)
// Autenticação auth := smtp.PlainAuth("", from, password, smtpHost)
// Envio err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message) if err != nil { fmt.Println("Erro ao enviar:", err) return } fmt.Println("Email enviado com sucesso!")}Importante: Para o Gmail, será necessário usar uma senha de aplicativo, e não a senha comum.
Envio de email HTML e email com anexos
O pacote net/smtp não consegue montar automaticamente mensagens MIME. Para emails HTML ou anexos, será necessário montar manualmente os cabeçalhos Content-Type e codificar os anexos em base64. Isso é trabalhoso, portanto, para emails complexos, é melhor usar bibliotecas de terceiros.
Bibliotecas de terceiros populares para envio de email em Go
Existem várias bibliotecas maduras que simplificam bastante o trabalho:
- go-gomail/gomail — uma das mais populares. Suporta HTML, anexos, incorporação de imagens e múltiplos destinatários.
- jordan-wright/email — biblioteca leve com API conveniente.
- sendgrid/sendgrid-go — cliente oficial para o serviço SendGrid (adequado para disparos em massa).
Exemplo com go-gomail
package main
import ( "fmt" "gopkg.in/gomail.v2")
func main() { m := gomail.NewMessage() m.SetHeader("From", "your_email@gmail.com") m.SetHeader("To", "recipient@example.com") m.SetHeader("Subject", "Email HTML com anexo") m.SetBody("text/html", "<h1>Olá!</h1><p>Este é um email <b>HTML</b>.</p>") m.Attach("/path/to/file.pdf") // Anexo
d := gomail.NewDialer("smtp.gmail.com", 587, "your_email@gmail.com", "your_app_password")
if err := d.DialAndSend(m); err != nil { fmt.Println("Erro:", err) return } fmt.Println("Email enviado!")}Envio assíncrono e pool de conexões
Se for necessário enviar muitos emails (por exemplo, após o registro de usuários), é importante não bloquear a thread principal. O Go lida muito bem com concorrência:
Também na biblioteca
Trabalho com datas em Rust: visão geral das bibliotecas para tempo e calendário
Trabalho com datas em Go (Golang): bibliotecas time, carbon e now
Autorização e Autenticação em Go (Golang): Guia Completo
Trabalho com Excel em C++: bibliotecas, exemplos e ferramentas