我尝试在go程序中使用smtp.SendMail()
。
然而,它会阻塞,直到超时才会返回。
这可以防止我发现错误。
我的代码:
to := []string{"recepient@example.com"}
err := smtp.SendMail("smtp.web.de:25", smtp.CRAMMD5Auth("example@web.de", "password"), "example@web.de", to, []byte("hi"))
if err != nil {
fmt.Println(err)
}else{
fmt.Println("Success")
}
很长一段时间后,我收到以下错误:
dial tcp 213.165.67.124:25: connection timed out
任何想法可能是什么问题?
答案 0 :(得分:1)
SendMail
拨号smtp服务器使用非tls tcp连接,也许您的smtp服务器默认使用带有ssl的tcp连接,不支持STARTTLS
扩展名。客户端发送STARTTLS
公用消息,服务器将不回复,因此现在处于阻塞状态。
func SendMail(addr string, a Auth, from string, to []string, msg []byte) error {
......
if ok, _ := c.Extension("STARTTLS"); ok {
config := &tls.Config{ServerName: c.serverName}
if testHookStartTLS != nil {
testHookStartTLS(config)
}
if err = c.StartTLS(config); err != nil {
return err
}
}
......
}
现在您可以使用tls来使smtp服务器失效,并且这不会阻塞,详细信息请参见 example code,或使用非tls端口。
// SendMailTLS connects to the server at addr, default use TLS
func SendMailTLS(addr string, auth smtp.Auth, from string, to []string, msg []byte) error {
......
tlsconfig := &tls.Config{ServerName: host}
if err = validateLine(from); err != nil {
return err
}
......
conn, err := tls.Dial("tcp", addr, tlsconfig)
if err != nil {
return err
}
defer conn.Close()
c, err := smtp.NewClient(conn, host)
......
答案 1 :(得分:0)
如果您看到超时,可以尝试直接使用net.Dial验证连接:
conn, err := net.Dial("tcp", "smtp.web.de:25")
if err != nil {
fmt.Println(err)
}
如果没有连接,则有一些本地阻塞套接字。向当地网络人员询问防火墙设置,或者是否有任何网络代理类型设备拦截传出流量。
答案 2 :(得分:-2)
我非常确定端口上的任何内容:25在路由器级别被阻止,因此您必须更改路由器或服务器提供商设置。