Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Email 如何在没有任何smtp服务器的情况下在golang发送电子邮件_Email_Go_Smtp - Fatal编程技术网

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

Email 如何在没有任何smtp服务器的情况下在golang发送电子邮件,email,go,smtp,Email,Go,Smtp,我想从用golang编写的服务器应用程序发送批量邮件。我只是不想使用任何第三方smtp服务器来避免使用配额限制 没有smtp服务器我如何发送电子邮件?标准库中的smtp包是否可以帮助我?我看到的所有使用smtp包的示例都需要第三方smtp服务器来发送电子邮件。您的问题看起来像-我可以向没有web服务器的用户显示网页吗?是的,如果您能够编写自己的web服务器,您可以 你能在运行中编写SMTP服务器吗?对谷歌展示了一些“golang smtp服务器”查询的解决方案。因此,我非常确定您可以将SMTP服

我想从用golang编写的服务器应用程序发送批量邮件。我只是不想使用任何第三方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就是这样做的。我使用exim
cmd:=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
}