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

Отправка писем в Go с пакетом email и smtp

5 min read Development Обновлено 13 Apr 2026
Отправка писем в Go: email и smtp
Отправка писем в Go: email и smtp

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

Зачем это нужно

При разработке приложений часто приходится отправлять уведомления, письма для подтверждения учётной записи, сброса пароля и отчёты. Стандартная библиотека Go содержит пакет “net/smtp” и “mail”, но их использование требует ручной настройки MIME, вложений и TLS. Пакет “email” абстрагирует эти сложности и ускоряет разработку.

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

Краткий обзор пакета email

Пакет “email” — лёгкая и гибкая библиотека. Она позволяет создать письмо с HTML и plain-text телом, прикрепить файлы, задать CC/BCC, пользовательские заголовки и поддерживает безопасные SMTP-соединения. Пакет совместим с Go 1.15 и выше.

Важно: сам пакет не отправляет письма напрямую без SMTP-сервера — он формирует сообщение и использует механизм доставки (например, net/smtp).

Установка и импорт

Установите пакет командой:

go get github.com/jordan-wright/email

Импорт в коде выглядит так:

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

Пояснение: пакет “fmt” нужен для вывода в консоль, а “net/smtp” — для аутентификации и отправки по SMTP.

Быстрый пример: создание и отправка письма

Ниже пример, близкий к реальному использованию. Переменные с учётными данными лучше хранить в переменных окружения или менеджере секретов.

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.Cc = []string{"cc@example.com"}
newEmail.Bcc = []string{"bcc@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:", err)
} else {
    fmt.Println("The mail was sent successfully")
}

Поля:

  • From — адрес отправителя.
  • To, Cc, Bcc — срезы строк для получателей.
  • Subject — тема письма.
  • Text — тело письма как []byte. Для HTML используйте поле HTML.

Результат успешной отправки письма

Пояснение аутентификации PlainAuth

smtp.PlainAuth принимает четыре аргумента: identity, username, password, host. В большинстве сценариев identity оставляют пустым. PlainAuth реализует простой механизм аутентификации — он подходит, когда соединение защищено TLS/SSL.

Порты и TLS: что важно знать

  • Порт 465 обычно используется для SMTPS (SSL/TLS сразу при подключении).
  • Порт 587 — часто используется для STARTTLS: сначала устанавливается обычное соединение, затем клиент инициирует TLS.

При использовании PlainAuth убедитесь, что соединение защищено TLS (например, подключение к 465 или явный STARTTLS на 587). Пакет “email” поддерживает безопасные соединения, но окончательная настройка зависит от SMTP-сервера.

Безопасность и управление секретами

Важно не хранить пароли в коде. Рекомендации:

  • Используйте переменные окружения (.env файлы в деве, но в продакшене — secret manager).
  • Генерируйте и используйте app-passwords (пароли приложений), если провайдер поддерживает (Gmail, Yahoo).
  • Ограничьте доступ к ключам/файлам с секретами на уровне CI/CD и хранилищ.
  • По возможности используйте API провайдера почты (SendGrid, AWS SES) вместо прямого SMTP — это часто безопаснее и масштабируемее.

Пример чтения из переменных окружения:

import (
    "os"
)

mail := os.Getenv("SMTP_USER")
password := os.Getenv("SMTP_PASS")

Когда пакет email не подходит

  • Если вам нужна высокая доставляемость и аналитика (отслеживание открытий, кликов), разумнее использовать сервисы типа SendGrid, Mailgun, AWS SES.
  • Для массовой рассылки под высокую нагрузку нужен специализированный SMTP-реле или API.
  • Если проект требует строгой изоляции и контроля очередей, стоит внедрять отдельный почтовый сервис и очереди (RabbitMQ, Kafka).

Альтернативные подходы

  • Стандартный пакет net/smtp — хорош для простых задач, но требует ручной сборки MIME и вложений.
  • Библиотеки Gomail и другие обёртки — похожи по функционалу на “email”.
  • API-провайдеры (SendGrid, Mailgun, SES) предлагают REST/HTTP-интерфейсы с дополнительными возможностями.

Мини-методология внедрения (шаги)

  1. Оцените требования по объёму, доставляемости и безопасности.
  2. Выберите подход: SMTP через “email” или внешний API.
  3. Настройте тестовый SMTP-аккаунт и переменные окружения.
  4. Реализуйте отправку и обработку ошибок (повторы, логирование).
  5. Нагрузочное тестирование и мониторинг доставляемости.
  6. Перенос в продакшен с использованием секретного хранилища.

Чеклист перед релизом

  • Нет хардкоженных паролей в репозитории.
  • Используется TLS/STARTTLS.
  • Обработаны ошибки отправки и логируются детали.
  • Настроены метрики и алёрты на провалы отправки.
  • Проведены тесты отправки на рабочие ящики (функционально и на доставляемость).

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

  • Электронное письмо отправляется без ошибок в 95% тестовых попыток.
  • Письмо корректно отображается в популярных почтовых клиентах (plain + HTML).
  • Вложения доставляются и открываются без повреждений.
  • Секреты не находятся в исходном коде.

Практические шаблоны и подсказки

Пример .env (не добавляйте в VCS):

SMTP_USER=you@example.com
SMTP_PASS=app-password-here
SMTP_HOST=smtp.mail.yahoo.com
SMTP_PORT=465

Подсказки:

  • Для вложений используйте методы пакета email (AttachFile и т. п.).
  • Для отправки HTML + текстовой версии заполняйте и Text, и HTML поля.

Диагностика ошибок: основные шаги

  1. Проверьте параметры хоста и порта.
  2. Убедитесь, что пароль/логин корректны и аккаунт позволяет SMTP-аутентификацию.
  3. Проверьте логи SMTP-сервера (если есть доступ).
  4. Попробуйте подключиться через openssl или telnet для отладки TLS/STARTTLS.

Модель принятия решения (flowchart)

flowchart TD
    A[Нужно отправлять почту?] --> B{Высокая нагрузка или аналитика?}
    B -- Да --> C[Использовать API провайдера 'SendGrid/SES/Mailgun']
    B -- Нет --> D{Требуется гибкость формата и вложений?}
    D -- Да --> E[Использовать пакет 'email' и SMTP]
    D -- Нет --> F[Использовать net/smtp 'стандартный пакет']
    C --> G[Интеграция через HTTP API]
    E --> G[Интеграция через SMTP с TLS]
    F --> G[Простая отправка без сложных вложений]

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

  • Риск: блокировка SMTP со стороны провайдера. Смягчение: использовать app-passwords и следовать политике провайдера.
  • Риск: утечка секретов. Смягчение: секрет-менеджеры, ограничения доступа.
  • Риск: низкая доставляемость. Смягчение: SPF/DKIM/DMARC и репутация отправителя.

Итог

Пакет “email” от Jordan Wright — удобный инструмент для ускорения разработки отправки писем в Go. Он скрывает сложности формирования писем и совместим с “net/smtp” для доставки. Для продакшен-решения уделите внимание безопасности, управлению секретами и мониторингу доставляемости.

Ключевые следующие шаги: выбрать способ доставки (SMTP или API), настроить TLS, вынести секреты в безопасное хранилище и протестировать отправку на реальных почтовых ящиках.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Портретный режим на Mac — размыть фон в любых приложениях
Руководство

Портретный режим на Mac — размыть фон в любых приложениях

Блокировка ячеек в Excel — пошагово
Excel

Блокировка ячеек в Excel — пошагово

AnyDesk не запускается в Windows 11 — как исправить
Windows

AnyDesk не запускается в Windows 11 — как исправить

Удалённый доступ к Ubuntu: VNC, RDP, SSH
Ubuntu

Удалённый доступ к Ubuntu: VNC, RDP, SSH

Как выбрать вентиляторы корпуса для ПК
Комплектующие

Как выбрать вентиляторы корпуса для ПК

Печать с iPhone и iPad: AirPrint и приложения
Инструкции

Печать с iPhone и iPad: AirPrint и приложения