5

我尝试smtp.SendMail()在 go 程序中使用。但是它会阻塞并且在超时之前不会返回。这使我无法找出问题所在。

我的代码:

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

有什么想法可能是真正的问题吗?

4

3 回答 3

2

SendMail拨号 smtp 服务器使用非 tls tcp 连接,可能您的 smtp 服务器默认使用 ssl tcp 连接,不支持STARTTLS扩展。客户端发送STARTTLScommand,服务器不会回复,所以现在是阻塞的。

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 服务器,这不会阻塞,详情请参阅 示例代码,或使用非 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)
    ......
于 2020-04-11T10:15:41.560 回答
0

如果您看到超时,您可以尝试使用 net.Dial 直接验证连接:

conn, err := net.Dial("tcp", "smtp.web.de:25")
if err != nil {
    fmt.Println(err)
}

如果那没有连接,那么本地有东西阻塞了套接字。向本地网络人员询问防火墙设置或是否有任何网络代理类型的设备拦截传出流量。

于 2015-08-05T08:49:43.740 回答
-3

我很确定端口 :25 上经过的任何东西都在路由器级别被阻止,因此您必须更改路由器或服务器提供商设置。

于 2014-05-14T14:16:18.870 回答