Работали ли вы с 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-сообщений и работу с вложениями.

Ответ 18+ 🔞

А, работал, говоришь? Ну да, в Go для этой ебушки-воробушки с почтой есть стандартный пакет 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). Смотри, что твой почтовый сервер поддерживает, а то отправишь письмо в никуда, в рот меня чих-пых.
  • Шифрование: С портом 587 net/smtp сам по себе STARTTLS подтянет. А вот если тебе прям SSL/TLS (порт 465) нужен, то тут уже придётся повозиться с crypto/tls, чтобы соединение установить, и потом это дело в smtp.NewClient пихать. Геморрой, короче.
  • Форматирование: Ну, если тебе просто «привет, как дела» отправить — то и этого хватит. А если тебе, сука, письмо с HTML, картинками и вложениями нужно — это пиздец. Тут уже лучше не мучаться, а взять готовую библиотеку, типа gomail или go-mail. Они всю эту ебучую MIME-магию за тебя сделают, а ты будешь только доволен.