Email 如何在没有任何smtp服务器的情况下在golang发送电子邮件
我想从用golang编写的服务器应用程序发送批量邮件。我只是不想使用任何第三方smtp服务器来避免使用配额限制Email 如何在没有任何smtp服务器的情况下在golang发送电子邮件,email,go,smtp,Email,Go,Smtp,我想从用golang编写的服务器应用程序发送批量邮件。我只是不想使用任何第三方smtp服务器来避免使用配额限制 没有smtp服务器我如何发送电子邮件?标准库中的smtp包是否可以帮助我?我看到的所有使用smtp包的示例都需要第三方smtp服务器来发送电子邮件。您的问题看起来像-我可以向没有web服务器的用户显示网页吗?是的,如果您能够编写自己的web服务器,您可以 你能在运行中编写SMTP服务器吗?对谷歌展示了一些“golang smtp服务器”查询的解决方案。因此,我非常确定您可以将SMTP服
没有smtp服务器我如何发送电子邮件?标准库中的smtp包是否可以帮助我?我看到的所有使用smtp包的示例都需要第三方smtp服务器来发送电子邮件。您的问题看起来像-我可以向没有web服务器的用户显示网页吗?是的,如果您能够编写自己的web服务器,您可以 你能在运行中编写SMTP服务器吗?对谷歌展示了一些“golang smtp服务器”查询的解决方案。因此,我非常确定您可以将SMTP服务器功能集成到您的应用程序中
但正如评论员所说,您的大部分邮件(如果不是全部的话)将直接进入大部分服务的垃圾邮件文件夹。只有一种方法可以发送电子邮件而不直接与SMTP服务器通信:将此操作委托给其他程序 选择什么程序本身就是一个开放而广泛的问题,因为有很多程序可以发送邮件 另一方面,如果我们谈论POSIX系统,例如基于GNU/Linux或*BSD的操作系统,它们通常带有二进制
/usr/sbin/sendmail
,有时,/usr/bin/sendmail
由真实软件包提供,或由其他大量存在的软件包提供,从成熟的MTA(如或)到范围狭窄的“空客户端”(如ssmtp
或nullmailer
)
此程序通常使用-t
命令行选项调用,该选项使其能够从邮件本身的到头读取邮件收件人的地址
基本上,调用/usr/sbin/sendmail-t
并将完整消息的文本传输到其标准输入,这就是功能所在,FWIW
虽然您可以直接使用os/exec
、net/mail
和net/textproto
标准软件包执行此调用,但流行的软件包提供了一种更简单的方法:它的Message
类型提供了WriteTo()
方法,可以写入正在运行的Sendmail实例,如下所示(摘自我的真实程序):
实际上,依靠MTA发送邮件有一个优势,那就是成熟的MTA支持邮件队列:也就是说,如果MTA无法立即发送您的邮件(例如,由于网络中断等),那么它会将邮件保存在一个特殊目录中,然后定期尝试一次又一次地发送邮件,直到成功或失败(通常很大,比如4-5天)超时过期。您需要一个SMTP服务器。任何服务器/服务(如Mandrill)将强制执行某种配额以防止垃圾邮件并维护声誉。您可以在本地或自己的服务器上运行,但您会发现,由于发件人声誉不足,大多数邮件将无法送达。被否决的投票者,我不明白被否决的原因。您能澄清问题的症结吗?@elithrar,我目前不担心我不想把邮件发送到公共电子邮件领域。我只想知道如何在golangOh实现目标,在写下我的答案后,我实际上“明白了”,你的问题不是技术性的,而是政治性的。那么,答案是“不”:您的邮件仍然需要通过某个SMTP服务器发送,除非您使用的是公开非SMTP API的邮件服务,但我怀疑这是否能够克服该服务的配额限制。因此,基本上答案是“租用VPS并在那里运行真正的MTA”。我不同意。当然,在发送方不使用SMTP服务器的情况下发送邮件是可能的:获取电子邮件地址,找到相应的MX,直接与它联系并(尝试)发送邮件。它会被接受吗?很可能不会。此方法有效吗?确实有效。MTA就是这样做的。我使用eximcmd:=exec.Command(“/usr/sbin/exim”,“-t”)
但我没有收到任何以密件抄送的邮件heisGarvit@gmail.com”
,但我在同一封电子邮件中收到的“收件人”邮件设置为不同的电子邮件地址。而且我只选中了所有“抄送”越来越mails@GarvitJain我看不出这与OP问题的本质和我的回答有什么关系。是否愿意向?@garvit jain发布一个建设性的问题,我上面的评论是写给你的;对不起,在智能手机上打字时很难正确地指代某人。我已经发布了这个问题:
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
}