Работали ли вы с SMTP?

Ответ

Да, работал. В Go для отправки писем через SMTP используется стандартный пакет net/smtp. Основные функции - smtp.SendMail() для отправки и smtp.PlainAuth() для аутентификации.

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

package main

import (
    "fmt"
    "log"
    "net/smtp"
)

func main() {
    from := "sender@example.com"
    pass := "your_email_password"
    to := "recipient@example.com"
    smtpHost := "smtp.example.com"
    smtpPort := "587" // Обычно 587 для TLS или 465 для SSL

    // Формирование сообщения в формате RFC 822
    msg := []byte(
        "From: " + from + "rn" +
        "To: " + to + "rn" +
        "Subject: Тестовое письмо из Gorn" +
        "MIME-version: 1.0;rn" +
        "Content-Type: text/plain; charset="UTF-8";rn" +
        "rn" +
        "Привет, это тестовое письмо, отправленное из Go.rn",
    )

    // Аутентификация
    auth := smtp.PlainAuth("", from, pass, smtpHost)

    // Отправка письма
    err := smtp.SendMail(
        smtpHost+":"+smtpPort,
        auth,
        from,
        []string{to},
        msg,
    )
    if err != nil {
        log.Fatalf("Ошибка при отправке письма: %v", err)
    }
    fmt.Println("Письмо успешно отправлено!")
}

Важные аспекты:

  • Порты: Обычно используются порты 587 (для STARTTLS) или 465 (для SMTPS/SSL). Убедитесь, что ваш SMTP-сервер поддерживает выбранный порт и метод шифрования.
  • Шифрование: net/smtp поддерживает STARTTLS по умолчанию для порта 587. Для прямого SSL/TLS соединения (порт 465) может потребоваться использование crypto/tls для установления соединения, а затем передача его в smtp.NewClient.
  • Форматирование сообщений: Для сложных писем (HTML, вложения, несколько частей) рекомендуется использовать сторонние библиотеки, такие как gomail или go-mail, которые значительно упрощают формирование MIME-сообщений и работу с вложениями.