Email 转到:连接到SMTP服务器并在一个连接中发送多封电子邮件?
我正在编写一个包,我打算与本地SMTP服务器建立一个初始连接,然后它在一个通道上等待,该通道将填充电子邮件,以便在需要发送电子邮件时发送 查看net/http,似乎期望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.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终止时,它将关闭连接。