Как отправлять электронные письма в Голанге без SMTP-сервера

Я хочу отправить массовую почту из серверного приложения, написанного на golang. Я просто не хочу использовать какой-либо сторонний SMTP-сервер, чтобы избежать ограничений на использование квот.

Как я могу отправить электронную почту без сервера SMTP? Может ли пакет smtp в стандартной библиотеке помочь мне? Во всех примерах, которые я вижу при использовании пакета smtp, для отправки электронной почты требуется сторонний сервер smtp.

2 ответа

Решение

Существует только один способ отправить сообщение электронной почты без прямой связи с SMTP-сервером: делегировать это действие какой-либо другой программе.

Какую программу выбрать, это открытый и широкий вопрос сам по себе, потому что существует множество программ, способных отправлять письма.

С другой стороны, если мы говорим о системах POSIX, таких как операционные системы на основе GNU/Linux или *BSD, они обычно поставляются с двоичным /usr/sbin/sendmail или иногда /usr/bin/sendmail который предоставляется либо реальным пакетом Sendmail, либо другим MTA, которые существуют в изобилии - от полноценных MTA, таких как Postfix или Exim, до узкопрофильных "нулевых клиентов", таких как ssmtp или же nullmailer,

Эта программа обычно вызывается с -t опция командной строки, которая заставляет его читать адреса получателей сообщения из To Заголовки самого почтового сообщения.

В основном зовет /usr/sbin/sendmail -t и передача всего текста сообщения на его стандартный ввод - вот что делает PHP mail() Функция делает, FWIW.

Хотя вы можете сделать этот вызов непосредственно с помощью os/exec, net/mailа такжеnet/textprotoстандартные пакеты, популярныеgomail Пакет предоставляет более простой способ сделать это: его Message тип обеспечивает WriteTo() метод, который может записывать в работающий экземпляр Sendmail, например, (скопированный из моей реальной программы):

const sendmail = "/usr/sbin/sendmail"

func submitMail(m *gomail.Message) (err error) {
    cmd := exec.Command(sendmail, "-t")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    pw, err := cmd.StdinPipe()
    if err != nil {
        return
    }

    err = cmd.Start()
    if err != nil {
        return
    }

    var errs [3]error
    _, errs[0] = m.WriteTo(pw)
    errs[1] = pw.Close()
    errs[2] = cmd.Wait()
    for _, err = range errs {
        if err != nil {
            return
        }
    }
    return
}

Фактически, использование MTA для доставки почты имеет преимущество в том, что полномасштабные MTA поддерживают организацию очереди почты: то есть, если MTA не может сразу отправить ваше сообщение (скажем, из-за сбоя в сети и т. Д.), То это сэкономит сообщение в специальном каталоге, а затем будет периодически пытаться доставить его снова и снова, пока это не удастся или не истечет (обычно огромный, например, 4-5 дней) тайм-аут.

Ваш вопрос выглядит так: могу ли я показывать веб-страницы пользователям без веб-сервера? Да, если вы можете написать свой собственный веб-сервер.

Можете ли вы написать SMTP сервер на Go? Да. Google показывает несколько решений для запроса "golang smtp server". Поэтому я уверен, что вы можете интегрировать функционал SMTP-сервера в ваше приложение.

Но, как сказали комментаторы, большая часть ваших сообщений (если не все) будет отправляться непосредственно в папку со спамом на большинстве сервисов.

Другие вопросы по тегам