Golang smtp.SendMail阻止

时间:2013-10-06 16:01:53

标签: smtp go

我尝试在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

任何想法可能是什么问题?

3 个答案:

答案 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在路由器级别被阻止,因此您必须更改路由器或服务器提供商设置。