如何在没有任何SMTP服务器的情况下使用Golang发送电子邮件 [英] How to send emails in golang without any smtp server

查看:556
本文介绍了如何在没有任何SMTP服务器的情况下使用Golang发送电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从用golang编写的服务器应用程序发送批量邮件。我只是不想使用任何第三方smtp服务器来避免使用配额限制。



如何在没有smtp服务器的情况下发送电子邮件?标准库中的smtp软件包可以帮助我吗?我看到的所有使用smtp软件包的示例都需要第三方smtp服务器发送电子邮件。

解决方案

只有一种方法可以在不直接与SMTP服务器通信的情况下发送电子邮件:将该操作委托给其他程序。



选择哪种程序本身就是一个开放且广泛的问题因为有很多程序可以发送邮件。



另一方面,如果我们谈论POSIX系统,例如基于GNU / Linux或* BSD的系统操作系统,它们通常 随二进制文件 / usr / sbin / sendmail 一起提供,有时甚至是 / usr / bin /由实际的 Sendmail 软件包提供的sendmail 或由另一个 MTA (以后缀进出口到范围狭窄的空客户端,例如 ssmtp nullmailer



此程序通常用 -t调用命令行选项,它使它从邮件本身的 To 标头中读取邮件收件人的地址。



基本调用 / usr / sbin / sendmail -t 并将完整消息文本传递到其标准输入就是 PHP的 mail()函数确实如此,FWIW。 / p>

虽然您可以直接使用 os / exec net / mail net / textproto 标准软件包,流行的 gomail 软件包提供了一种更简单的方法:其 Message 类型提供了 WriteTo()方法能够像这样(从我的真实程序中复制)写入正在运行的Sendmail实例:

  const sendmail = / usr / sbin / sendmail 

func SubmitMail(m * gomail.Message)(错误错误){
cmd:= exec.Command(sendmail, -t)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

pw,err:= cmd.StdinPipe()
如果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( )_的
,错误=范围错误{如果错误,则
{=
return
}
}
return
}

实际上,依靠MTA传递邮件有一个优势,就是成熟的MTA支持邮件排队:是,如果MTA无法立即发送您的消息(例如,由于$ a $。由于网络中断等原因),它将把邮件保存在一个特殊的目录中,然后定期尝试一次又一次地传递它,直到成功为止或(通常是巨大的,如4-5天)超时。


I want to send bulk mail from a server application written in golang. I just don't want to use any third-party smtp server to avoid usage quota limitations.

How can I send email without a smtp server? Is smtp package in standard library can help me? All example I see using the smtp package requires a third-party smtp server to send email.

解决方案

There is only one way to send an e-mail message without directly communicating with an SMTP server: delegate this action to some other program.

What program to pick, is an open and wide question in itself because there are lots of programs which are able to send mails.

On the other hand, if we talk about POSIX systems such as GNU/Linux- or *BSD-based operating systems, they usually come with the binary /usr/sbin/sendmail or, sometimes, /usr/bin/sendmail which is either provided by the real Sendmail package or by another MTA which exist in abundance—ranging from full-blown MTAs such as Postfix or Exim to narrow-scoped "null-clients" such as ssmtp or nullmailer.

This program is usually called with the -t command-line option which makes it read the addresses of the message recipients from the To headers of the mail message itself.

Basically calling /usr/sbin/sendmail -t and piping the full message's text to its standard input is what PHP's mail() function does, FWIW.

While you can do this call directly using the os/exec, net/mail and net/textproto standard packages, the popular gomail package provides a simpler way to do that: its Message type provides the WriteTo() method which is able to write to a running Sendmail instance, like this (copied from a real program of mine):

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
}

Actually, relying on MTA to deliver your mails has an advantage is that full-blown MTAs support mail queuing: that is, if an MTA is unable to send your message right away (say, due to a network outage etc) so it will save the message in a special directory and will then periodically try delivering it again and again until that succeeds or a (usually huge, like 4-5 days) timeout expires.

这篇关于如何在没有任何SMTP服务器的情况下使用Golang发送电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆