Email 转到:连接到SMTP服务器并在一个连接中发送多封电子邮件?

Email 转到:连接到SMTP服务器并在一个连接中发送多封电子邮件?,email,go,smtp,smtp-auth,Email,Go,Smtp,Smtp Auth,我正在编写一个包,我打算与本地SMTP服务器建立一个初始连接,然后它在一个通道上等待,该通道将填充电子邮件,以便在需要发送电子邮件时发送 查看net/http,似乎期望SMTP服务器在每次发送电子邮件时都应拨入并进行身份验证。当然,我可以拨一次电话并进行身份验证,保持连接打开,并在收到新邮件时添加新邮件 查看smtp.SendMail的源代码,我看不出如何做到这一点,因为似乎没有办法回收*客户端: 对于*客户端,有一个重置功能,但其说明如下: Reset sends the RSET com

我正在编写一个包,我打算与本地SMTP服务器建立一个初始连接,然后它在一个通道上等待,该通道将填充电子邮件,以便在需要发送电子邮件时发送

查看net/http,似乎期望SMTP服务器在每次发送电子邮件时都应拨入并进行身份验证。当然,我可以拨一次电话并进行身份验证,保持连接打开,并在收到新邮件时添加新邮件

查看
smtp.SendMail
的源代码,我看不出如何做到这一点,因为似乎没有办法回收
*客户端

对于
*客户端
,有一个
重置
功能,但其说明如下:

 Reset sends the RSET command to the server, aborting the current mail transaction.
我不想中止当前邮件事务,我想有多个邮件事务


如何保持与SMTP服务器的连接处于打开状态,并在一个连接上发送多封电子邮件?

您认为
SMTP.SendMail
不提供重新使用连接的方法是正确的

如果您想要细粒度的控件,那么应该使用持久的客户端连接。这需要更多地了解smtp命令和协议

  • 使用
    smtp.Dial
    打开连接并创建客户端对象
  • 根据需要使用
    client.Hello
    client.Auth
    client.StartTLS
  • 使用
    Rcpt
    Mail
    Data
    作为发送消息的适当方式
  • client.Quit()
    完成后关闭连接

  • Gomail v2现在支持在一个连接中发送多封电子邮件。文档中的内容似乎与您的用例相匹配:

    ch := make(chan *gomail.Message)
    
    go func() {
        d := gomail.NewPlainDialer("smtp.example.com", 587, "user", "123456")
    
        var s gomail.SendCloser
        var err error
        open := false
        for {
            select {
            case m, ok := <-ch:
                if !ok {
                    return
                }
                if !open {
                    if s, err = d.Dial(); err != nil {
                        panic(err)
                    }
                    open = true
                }
                if err := gomail.Send(s, m); err != nil {
                    log.Print(err)
                }
            // Close the connection to the SMTP server if no email was sent in
            // the last 30 seconds.
            case <-time.After(30 * time.Second):
                if open {
                    if err := s.Close(); err != nil {
                        panic(err)
                    }
                    open = false
                }
            }
        }
    }()
    
    // Use the channel in your program to send emails.
    
    // Close the channel to stop the mail daemon.
    close(ch)
    
    ch:=make(chan*gomail.Message)
    go func(){
    d:=gomail.NewPlainDialer(“smtp.example.com”,587,“user”,“123456”)
    var s gomail.SendCloser
    变量错误
    开放:=假
    为了{
    挑选{
    
    案例m,ok:=谢谢…发送另一封电子邮件时,连接在什么时候重置?我是在每条邮件的末尾还是在发送所有邮件的末尾使用
    client.Quit()
    ?Quit表示“我已完成并准备断开连接”。只在所有邮件的末尾发送。无需执行第一步(自己打开
    net.Conn
    )。您可以只使用
    smtp.Dial
    。基本上,只需执行
    smtp.SendMail
    所做的几乎完全相同的操作,除了在调用
    Quit
    之前,返回并执行更多
    Mail
    Rcpt
    数据调用。在这种情况下,我将永远不会运行Quit()或Close()由于Go webapp始终保持拨入SMTP服务器。当Go app退出时,连接会自动终止吗?成功了!非常感谢。我将退出和关闭作为延迟操作放在等待频道的goroutine中。因此,当goroutine终止时,它将关闭连接。