Golang smtp.发送邮件阻止

e4eetjau  于 2023-01-18  发布在  Go
关注(0)|答案(3)|浏览(333)

我试着在一个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

知道真正的问题是什么吗?

cwxwcias

cwxwcias1#

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)
    ......
n8ghc7c1

n8ghc7c12#

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

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

如果没有连接,那么有一些本地阻塞套接字。询问您本地网络的家伙有关防火墙设置或是否有任何网络代理类型的设备拦截传出的流量。

nhhxz33t

nhhxz33t3#

我敢肯定,任何通过端口:25是阻止在路由器的水平,所以你将不得不改变你的路由器或服务器提供商的设置。

相关问题