Отправка email на Go (Golang): библиотеки и примеры кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка 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                    

Рекомендаций