Гид по технологиям

Отправка почты в Go: пакет email и встроенный smtp

5 min read Разработка Go Обновлено 29 Dec 2025
Отправка почты в Go: email и smtp
Отправка почты в Go: email и smtp

Важно: в продакшене никогда не храните пароли в открытом виде в коде. Используйте менеджеры секретов или переменные окружения.

Иконка почтового приложения

При разработке приложений часто требуется отправлять письма: уведомления, подтверждения регистрации, сброс пароля, отчёты и т. д. В стандартной библиотеке Go есть пакеты net/smtp и mime/multipart для работы с почтой, но их использование может быть громоздким. В экосистеме Go также есть несколько удобных сторонних библиотек — одна из популярных и простых в использовании — github.com/jordan-wright/email.

Краткое сравнение подходов

  • github.com/jordan-wright/email — удобный, компактный API, встроенная поддержка вложений, HTML, CC/BCC, кастомных заголовков и TLS. Подходит для большинства приложений.
  • net/smtp — встроенный, минималистичный, даёт полный контроль над SMTP-обменом, но требует больше кода для тех же задач.

Начало работы с пакетом email

Превью репозитория пакета email на GitHub

Пакет email лёгкий и гибкий. За несколько строк можно собрать и отправить письмо с вложениями и HTML. Пакет поддерживает защищённые SMTP-соединения и несколько получателей.

Установка (Go 1.15+):

go get github.com/jordan-wright/email

Импорт в файле Go:

import (
    "fmt"
    "github.com/jordan-wright/email"
    "net/smtp"
)

fmt используется для вывода в консоль, smtp — для аутентификации и передачи писем по SMTP.

Простой пример отправки письма

Ниже пример, структурированный пошагово, который показывает стандартный набор переменных и вызов Send.

mail := "your email"
password := "your app password"

hostAddress := "smtp.mail.yahoo.com"
hostPort := "465"

newEmail := email.NewEmail()
newEmail.From = mail
newEmail.To = []string{"recipient@example.com"}
newEmail.Subject = "The Email subject"
newEmail.Text = []byte("Body of your email")

err := newEmail.Send(
    fmt.Sprintf("%s:%s", hostAddress, hostPort),
    smtp.PlainAuth("", mail, password, hostAddress),
)

if err != nil {
    fmt.Println("There was an error sending the mail")
} else {
    fmt.Println("The mail was sent successfully")
}

Результат отправки письма — подтверждение в консоли

Пояснения к коду:

  • mail и password — учётные данные отправителя. В продакшене используйте переменные окружения или секретный менеджер.
  • hostAddress и hostPort — SMTP-сервер и порт провайдера (пример для Yahoo). Для Gmail это smtp.gmail.com:587 или smtp.gmail.com:465 в зависимости от TLS/STARTTLS.
  • NewEmail() возвращает структуру, у которой есть поля From, To, Cc, Bcc, Subject, Text, HTML, а также методы для добавления вложений.
  • Send принимает адрес хоста в формате host:port и объект аутентификации smtp.PlainAuth.

Полезные приёмы и шаблоны

Мини-методология: как надёжно и безопасно внедрить отправку почты в приложение

  1. Сначала реализуйте локально отправку в тестовый SMTP (например, MailHog или smtp4dev).
  2. Переведите конфигурацию (адреса, порты, логины) в переменные окружения или секретный менеджер.
  3. Подключите TLS/STARTTLS и проверьте сертификаты сервера.
  4. Добавьте повторные попытки и обработку временных ошибок (backoff).
  5. Логируйте только метаданные (от кого, кому, тема), но никогда не логируйте содержимое письма или пароли.
  6. Для массовых рассылок используйте очереди/пул подключений и ограничения по скорости (rate limiting).

Шаблон отправки с HTML и вложением:

newEmail := email.NewEmail()
newEmail.From = "Sender "
newEmail.To = []string{"recipient@example.com"}
newEmail.Subject = "Отчёт за день"
newEmail.Text = []byte("Текстовое сообщение")
newEmail.HTML = []byte("

HTML-версия

Отчёт внутри

") _, err := newEmail.AttachFile("/path/to/report.pdf") if err != nil { // обработка ошибки вложения } err = newEmail.Send("smtp.example.com:587", smtp.PlainAuth("", "user@example.com", "app-password", "smtp.example.com"))

Критерии приёмки

  • Письмо отправляется успешно на тестовый и рабочий SMTP.
  • Вложения корректно прикрепляются и открываются у получателя.
  • Логи не содержат чувствительной информации.
  • Повторные попытки при временных ошибках реализованы.

Когда подход с email не подходит (контрпримеры)

  • Массовые маркетинговые рассылки: лучше использовать специализированные сервисы (SendGrid, Mailgun, Amazon SES) для управления доставкой и мониторинга репутации.
  • Требуется гарантированная доставка и аналитика (открытия/клики): сторонние ESP дают готовую аналитику.
  • Ограничения провайдера почты по количеству отправляемых писем или скорости: в таких случаях реализуйте очереди с ограничением скорости или используйте специализированный сервис.

Альтернативы и миграция

  • Для массовых рассылок и аналитики: SendGrid, Mailgun, Postmark, Amazon SES.
  • Для локальной тестовой разработки: MailHog, smtp4dev.
  • Миграция с net/smtp на email: обычно тривиальна — создайте структуру письма и используйте email.NewEmail() вместо ручной сборки MIME.

Совместимость и версия Go

  • Пакет email поддерживает Go 1.15 и выше. Если ваш проект на более старой версии, обновите среду или используйте net/smtp с ручной сборкой MIME.

Риски и меры смягчения

  • Утечка секретов: хранить только в секретном хранилище. Ротация паролей и ключей.
  • Блокировка отправителя (blacklisting): следить за репутацией домена/IP и использовать DKIM/SPF/DMARC.
  • Неправильное форматирование писем: тестировать на популярных клиентах (Gmail, Outlook, мобильные).

Безопасность и соответствие конфиденциальности

  • При обработке персональных данных убедитесь, что письма не раскрывают избыточную информацию. Для EU/EEA учитывайте требования GDPR при рассылках персональных данных.
  • Настройте SPF, DKIM и DMARC для вашего домена, чтобы снизить вероятность попадания в спам.

Роль‑ориентированные чек‑листы

Разработчик

  • [ ] Использовать email.NewEmail() для удобства
  • Не хранить пароли в коде
  • Писать тесты отправки с моком SMTP или локальным тест-сервером

DevOps / Инженер платформы

  • Настроить секретный менеджер и доступы для службы отправки почты
  • Настроить мониторинг и алерты по сбоям отправки
  • Настроить DKIM/SPF/DMARC и мониторить репутацию IP

QA инженер

  • Проверить отправку HTML и текстовой версий
  • Проверить вложения и кодировку
  • Проверить поведение при ошибках сети и повторных попытках

Примеры тест-кейсов

  • Отправка письма с вложением 1 МБ — получить успешно.
  • Отправка письма с несуществующим адресом — обработать ошибку и не падать.
  • Разрыв соединения во время отправки — выполнить 3 попытки с экспоненциальным бэкоффом.

Глоссарий (в одну строку)

  • SMTP — протокол для передачи почты между серверами.
  • Bcc — скрытая копия (получатели не видят друг друга).
  • DKIM/SPF/DMARC — механизмы для улучшения доверия и прохождения в спам-фильтрах.

Короткая инструкция по миграции с net/smtp

  1. Найдите код, который вручную формирует MIME и заголовки.
  2. Замените на email.NewEmail() и заполните поля From, To, Subject, Text, HTML.
  3. Добавьте вложения через AttachFile или Attach.
  4. Используйте тот же smtp.PlainAuth или другой механизм аутентификации для Send.

Когда всё ещё нужен net/smtp

Если требуется точный контроль над потоками SMTP-команд или нужно реализовать специфичные расширения SMTP (например, PIPELINING или нестандартные расширения сервера), то net/smtp даёт низкоуровневый доступ. В большинстве прикладных случаев библиотека email значительно ускоряет разработку.

Конец — что нужно помнить

  • Для большинства задач используйте github.com/jordan-wright/email — это сокращает код и ошибки.
  • Для массовых рассылок и аналитики рассмотрите ESP.
  • Обеспечьте безопасность секретов, настройте SPF/DKIM/DMARC и тестируйте отправку на разных клиентах.

Краткое резюме

  1. email — простой путь к отправке писем с вложениями и HTML.
  2. net/smtp — встроенный и более детализируемый инструмент.
  3. Всегда используйте секреты и проверяйте безопасность и доставляемость.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Просмотр метаданных фото на iPhone (iOS 15)
iOS

Просмотр метаданных фото на iPhone (iOS 15)

Как воспроизвести два видео одновременно в VLC
Руководство

Как воспроизвести два видео одновременно в VLC

Split View на Mac — разделение экрана и советы
macOS

Split View на Mac — разделение экрана и советы

Конвертация видео в GIF на Linux
Инструкция

Конвертация видео в GIF на Linux

Как оценить реальный SEO‑рейтинг сайта
Поисковая оптимизация

Как оценить реальный SEO‑рейтинг сайта

Играть ретро-игры в Kodi через Internet Archive
Руководство

Играть ретро-игры в Kodi через Internet Archive