Отправка email на Go (Golang): библиотеки и примеры кода
Отправка электронных писем — одна из ключевых задач для любого веб-приложения: регистрация пользователей, сброс пароля, уведомления и рассылки. В языке Go (Golang) есть как стандартные средства для работы с SMTP, так и мощные сторонние библиотеки, упрощающие отправку писем с HTML-шаблонами, вложениями и поддержкой разных почтовых сервисов. В этой статье мы подробно рассмотрим, как отправлять email на Go, разберём популярные библиотеки и приведём практические примеры кода.
Стандартная библиотека net/smtp
Пакет net/smtp входит в стандартную библиотеку Go и предоставляет минимальный набор функций для отправки писем через SMTP-сервер. Он подходит для простых текстовых сообщений, но требует ручного формирования заголовков и тела письма в соответствии с RFC 5322.
Пример отправки простого текстового письма:
package main
import (
"fmt"
"net/smtp"
)
func main() {
// Данные для подключения к SMTP-серверу
smtpHost := "smtp.example.com"
smtpPort := "587"
from := "sender@example.com"
password := "your_password"
to := []string{"recipient@example.com"}
// Формируем тело письма (обязательно с заголовками)
subject := "Subject: Привет из Go!\n"
mime := "MIME-version: 1.0;\nContent-Type: text/plain; charset=\"UTF-8\";\n\n"
body := "Это тестовое письмо, отправленное с помощью Go."
msg := []byte(subject + mime + body)
// Аутентификация
auth := smtp.PlainAuth("", from, password, smtpHost)
// Отправка
err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg)
if err != nil {
fmt.Println("Ошибка отправки:", err)
return
}
fmt.Println("Письмо отправлено успешно!")
}
Ограничения net/smtp:
- Не поддерживает вложения без ручного кодирования Base64.
- Требует самостоятельного форматирования MIME-заголовков.
- Неудобен для отправки HTML-писем с изображениями.
Библиотека gomail/v2
Одна из самых популярных сторонних библиотек для отправки email на Go — gomail (пакет gopkg.in/mail.v2). Она предоставляет удобный API для работы с письмами: поддержка вложений, HTML и текстовых частей, настройка SMTP-соединения, а также возможность отправки через SSL/TLS.
Установка:
go get gopkg.in/mail.v2
Пример отправки HTML-письма с вложением:
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", "HTML-письмо с вложением")
// Альтернативные части: текст и HTML
m.SetBody("text/plain", "Если вы видите этот текст, ваш клиент не поддерживает HTML.")
m.AddAlternative("text/html", "<h1>Привет!</h1><p>Это HTML-версия письма.</p>")
// Добавляем вложение
m.Attach("/path/to/file.pdf")
// Настройка 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("Ошибка:", err)
return
}
fmt.Println("Письмо отправлено!")
}
Преимущества gomail:
- Простой и интуитивный API.
- Автоматическое формирование MIME-заголовков.
- Поддержка вложений и встроенных изображений (CID).
- Работа с SSL/TLS и StartTLS.
Библиотека go-smtp (emersion/go-smtp)
Библиотека go-smtp от emersion — это более низкоуровневая альтернатива, которая даёт полный контроль над SMTP-соединением. Она полезна, если вам нужно реализовать нестандартные сценарии: например, написать собственный SMTP-сервер или выполнить отправку через несколько серверов.
Установка:
go get github.com/emersion/go-smtp
Пример отправки через go-smtp:
package main
import (
"context Также в библиотеке
once_cell для Rust: полное руководство с примерами
neverthrow для TypeScript: полное руководство с примерами
OAuth клиент для Go (Golang): Подключение к OAuth 2.0 провайдерам
CLI-фреймворки для PHP: Symfony Console и Laravel Zero — полное руководство