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

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

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

Начать курс

Email отправка на Go (Golang): полный обзор библиотек и инструментов

В современной веб-разработке отправка электронных писем остаётся одной из ключевых задач для уведомлений, регистраций, восстановления паролей и рассылок. Язык Go (Golang) предлагает несколько эффективных способов интеграции с SMTP-серверами. В этой статье мы разберём стандартную библиотеку net/smtp, популярную стороннюю библиотеку gomail и расширенную go-smtp. Вы узнаете, как отправлять простые текстовые и HTML-письма, добавлять вложения и настраивать безопасное соединение.

1. Стандартная библиотека net/smtp

Пакет net/smtp встроен в Go и не требует дополнительной установки. Он предоставляет базовые функции для подключения к SMTP-серверу, аутентификации и отправки сообщений. Однако для работы с современными требованиями (HTML, вложения, SSL/TLS) потребуется написать больше кода.

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

package main

import (
    "fmt"
    "net/smtp"
)

func main() {
    // Настройки SMTP-сервера (пример для Gmail)
    smtpHost := "smtp.gmail.com"
    smtpPort := "587"
    from := "your_email@gmail.com"
    password := "your_app_password"
    to := []string{"recipient@example.com"}

    // Тема и тело письма (простейший формат)
    subject := "Subject: Тестовое письмо из Go\n"
    body := "Привет! Это сообщение отправлено с помощью net/smtp."
    msg := []byte(subject + "\n" + 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("Письмо успешно отправлено!")
}

Важно: Для Gmail необходимо использовать пароль приложения (не основной пароль) и разрешить доступ для ненадёжных приложений. Для других сервисов (Yandex, Mail.ru) параметры могут отличаться.

Отправка HTML-письма через net/smtp

Чтобы отправить HTML-письмо, нужно явно указать заголовок Content-Type:

package main

import (
    "fmt"
    "net/smtp"
)

func main() {
    smtpHost := "smtp.gmail.com"
    smtpPort := "587"
    from := "your_email@gmail.com"
    password := "your_app_password"
    to := []string{"recipient@example.com"}

    // Формируем MIME-заголовки
    headers := make(map[string]string)
    headers["From"] = from
    headers["To"] = "recipient@example.com"
    headers["Subject"] = "HTML письмо из Go"
    headers["MIME-Version"] = "1.0"
    headers["Content-Type"] = "text/html; charset=\"UTF-8\""

    // Собираем сообщение
    message := ""
    for k, v := range headers {
        message += fmt.Sprintf("%s: %s\r\n", k, v)
    }
    message += "\r\n" + "<h1>Привет!</h1><p>Это <b>HTML</b> письмо.</p>"

    auth := smtp.PlainAuth("", from, password, smtpHost)
    err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message))
    if err != nil {
        fmt.Println("Ошибка:", err)
    }
}

Недостаток net/smtp — отсутствие поддержки вложений и сложной многокомпонентной структуры письма. Для таких задач лучше использовать специализированные библиотеки.

2. Библиотека gomail

Gomail — одна из самых популярных сторонних библиотек для отправки email на Go. Она предоставляет удобный API, поддержку HTML, вложений, встраивания изображений, SSL/TLS и настраиваемых заголовков.

Установка

go get gopkg.in/mail.v2

Пример отправки HTML-письма с вложением

package main

import (
    "crypto/tls"
    "fmt"
    gomail "gopkg.in/mail.v2"
)

func main() {
    m := gomail.NewMessage()

    // Настройка отправителя и получателей
    m.SetHeader("From", "your_email@gmail.com")
    m.SetHeader("To", "recipient@example.com")
    m.SetHeader("Subject", "Письмо с вложением из Go")

    // HTML-тело письма
    m.SetBody("text/html", "<h2>Привет!</h2><p>Это письмо содержит                    

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