如何在没有任何smtp服务器的情况下在golang中发送电子邮件

Ani*_*jee 4 email smtp go

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

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

kos*_*tix 10

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

选择什么样的程序本身就是一个开放的问题,因为有很多程序可以发送邮件.

另一方面,如果我们谈论POSIX系统,例如基于GNU/Linux或*BSD的操作系统,它们通常带有二进制文件,/usr/sbin/sendmail或者有时,/usr/bin/sendmail它由真正的Sendmail包或由另一个存在的MTA提供.丰富的 - 从完整的MTA,如PostfixExim到窄范围的"null-clients",如ssmtpnullmailer.

此程序通常使用-t命令行选项调用,该选项使其从To邮件消息本身的标题中读取邮件收件人的地址.

基本上调用/usr/sbin/sendmail -t和传递完整消息的文本到其标准输入是PHP的mail()功能,FWIW.

虽然你可以做到这一点的呼叫直接使用os/exec,net/mailnet/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
}
Run Code Online (Sandbox Code Playgroud)

实际上,依靠MTA来发送邮件的一个优点是,完整的MTA支持邮件排队:即,如果MTA无法立即发送您的邮件(例如,由于网络中断等),那么它将节省在特殊目录中的消息,然后会定期尝试一次又一次地传递它,直到成功或(通常很大,如4-5天)超时到期.