Envio de email em Go (Golang): bibliotecas e exemplos de código
O envio de emails é uma das tarefas principais para qualquer aplicação web: registro de usuários, redefinição de senha, notificações e newsletters. Na linguagem Go (Golang), existem tanto ferramentas padrão para trabalhar com SMTP quanto poderosas bibliotecas de terceiros que simplificam o envio de emails com templates HTML, anexos e suporte a diferentes serviços de email. Neste artigo, vamos abordar detalhadamente como enviar email em Go, analisar bibliotecas populares e fornecer exemplos práticos de código.
Biblioteca padrão net/smtp
O pacote net/smtp faz parte da biblioteca padrão do Go e fornece um conjunto mínimo de funções para enviar emails através de um servidor SMTP. Ele é adequado para mensagens de texto simples, mas exige a formatação manual dos cabeçalhos e do corpo do email de acordo com a RFC 5322.
Exemplo de envio de um email de texto simples:
package main
import ( "fmt" "net/smtp")
func main() { // Dados para conexão ao servidor SMTP smtpHost := "smtp.example.com" smtpPort := "587" from := "sender@example.com" password := "your_password" to := []string{"recipient@example.com"}
// Formata o corpo do email (obrigatório com cabeçalhos) subject := "Subject: Olá do Go!" mime := "MIME-version: 1.0;Content-Type: text/plain; charset=\\"UTF-8\\";
" body := "Este é um email de teste enviado usando Go." msg := []byte(subject + mime + body)
// Autenticação auth := smtp.PlainAuth("", from, password, smtpHost)
// Envio err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg) if err != nil { fmt.Println("Erro ao enviar:", err) return } fmt.Println("Email enviado com sucesso!")}Limitações do net/smtp:
- Não suporta anexos sem codificação Base64 manual.
- Exige formatação manual dos cabeçalhos MIME.
- Não é prático para enviar emails HTML com imagens.
Biblioteca gomail/v2
Uma das bibliotecas de terceiros mais populares para envio de email em Go é o gomail (pacote gopkg.in/mail.v2). Ela oferece uma API conveniente para trabalhar com emails: suporte a anexos, partes HTML e texto, configuração de conexão SMTP e também a possibilidade de envio via SSL/TLS.
Instalação:
go get gopkg.in/mail.v2Exemplo de envio de email HTML com anexo:
package main
import ( "fmt" "gopkg.in/mail.v2")
func main() { m := mail.NewMessage() m.SetHeader("From", "sender@example.com") m.SetHeader("To", "recipient@example.com") m.SetHeader("Subject", "Email HTML com anexo")
// Partes alternativas: texto e HTML m.SetBody("text/plain", "Se você está vendo este texto, seu cliente não suporta HTML.") m.AddAlternative("text/html", "<h1>Olá!</h1><p>Esta é a versão HTML do email.</p>")
// Adiciona anexo m.Attach("/path/to/file.pdf")
// Configuração do cliente SMTP d := mail.NewDialer("smtp.example.com", 587, "sender@example.com", "your_password") d.StartTLSPolicy = mail.MandatoryStartTLS
if err := d.DialAndSend(m); err != nil { fmt.Println("Erro:", err) return } fmt.Println("Email enviado!")}Vantagens do gomail:
- API simples e intuitiva.
- Formatação automática dos cabeçalhos MIME.
- Suporte a anexos e imagens incorporadas (CID).
- Trabalha com SSL/TLS e StartTLS.
Biblioteca go-smtp (emersion/go-smtp)
A biblioteca go-smtp da emersion é uma alternativa de nível mais baixo que oferece controle total sobre a conexão SMTP. Ela é útil se você