Как отправлять электронные письма в Голанге без 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-сервера в ваше приложение.
Но, как сказали комментаторы, большая часть ваших сообщений (если не все) будет отправляться непосредственно в папку со спамом на большинстве сервисов.