我想从用golang编写的服务器应用程序发送批量邮件.我只是不想使用任何第三方smtp服务器来避免使用配额限制.
如何在没有smtp服务器的情况下发送电子邮件?标准库中的smtp包可以帮助我吗?我看到使用smtp包的所有示例都需要第三方smtp服务器来发送电子邮件.
kos*_*tix 10
只有一种方法可以在不直接与SMTP服务器通信的情况下发送电子邮件:将此操作委派给其他程序.
选择什么样的程序本身就是一个开放的问题,因为有很多程序可以发送邮件.
另一方面,如果我们谈论POSIX系统,例如基于GNU/Linux或*BSD的操作系统,它们通常带有二进制文件,/usr/sbin/sendmail
或者有时,/usr/bin/sendmail
它由真正的Sendmail包或由另一个存在的MTA提供.丰富的 - 从完整的MTA,如Postfix或Exim到窄范围的"null-clients",如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
}
Run Code Online (Sandbox Code Playgroud)
实际上,依靠MTA来发送邮件的一个优点是,完整的MTA支持邮件排队:即,如果MTA无法立即发送您的邮件(例如,由于网络中断等),那么它将节省在特殊目录中的消息,然后会定期尝试一次又一次地传递它,直到成功或(通常很大,如4-5天)超时到期.
归档时间: |
|
查看次数: |
5841 次 |
最近记录: |