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

Posted

技术标签:

【中文标题】Go:连接到 SMTP 服务器并在一个连接中发送多封电子邮件?【英文标题】:Go: Connect to SMTP server and send multiple emails in one connection? 【发布时间】:2015-08-07 15:15:35 【问题描述】:

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

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

smtp.SendMail*Client
*ClientReset
 Reset sends the RSET command to the server, aborting the current mail transaction.

我不想中止当前的邮件交易,我想进行多个邮件交易。

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

【问题讨论】:

【参考方案1】:
smtp.SendMail

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

【讨论】:

client.Quit()
quit 表示“我已经完成并准备断开连接”。仅在所有消息结束时发送。
net.Connsmtp.Dialsmtp.SendMailQuitMailRcptData
在这种情况下,我将永远不会运行 Quit() 或 Close(),因为 Go webapp 始终保持拨入 SMTP 服务器。 Go 应用退出时连接会自动终止吗? 成功了!非常感谢。我将 Quit and Close 作为延迟放在等待通道的 goroutine 中。因此,当 goroutine 终止时,它将关闭连接。【参考方案2】:

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

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)

【讨论】:

以上是关于Go:连接到 SMTP 服务器并在一个连接中发送多封电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章