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>Это письмо содержит