Golang 中 smtp 客户端的自定义拨号器?

我正在尝试通过 socks5 代理连接到 smtp 服务器


package main


import (

    "net"

    "net/smtp"


    "golang.org/x/net/proxy"

)


func main() { Connect() }

func Connect() {

    dialer, err := Socks("127.0.0.1:9050", "smtp.gmail.com:465")

    if err != nil {

        panic(err)

    }

    client, err := smtp.NewClient(dialer, "smtp.gmail.com:465")

    if err != nil {

        panic(err)

    }

    auth := smtp.PlainAuth("", "mymailaddr@gmail.com", "", "smtp.gmail.com:465")

    if err = client.Auth(auth); err != nil {

        panic(err)

    }

}


func Socks(socks, addr string) (r net.Conn, err error) {

    Dial, err := proxy.SOCKS5("tcp", socks, nil, proxy.Direct)

    r, err = Dial.Dial("tcp", addr)

    return

}

而且不能,有错误


panic: EOF


goroutine 1 [running]:

main.Connect()

        main.go:18 +0x1e5

main.main()

        main.go:10 +0x20

exit status 2

有smtp.Client什么方法可以将 smtp 服务器与 socks 代理连接?我没有在谷歌中找到答案,也没有找到任何图书馆提供此功能。


青春有我
浏览 149回答 1
1回答

心有法竹

您使用的端口 465 从一开始就需要 TLS(隐式 TLS),而不是在 STARTTLS 命令(显式 TLS)之后使用通常的 TLS。这意味着Conn您使用的对象dialer应该已经升级到 TLS。去做这个:import "crypto/tls"...func Connect() {    dialer, err := Socks("127.0.0.1:9050", "smtp.gmail.com:465")    ...    conf := &tls.Config{ServerName: "smtp.gmail.com"}    tlsdialer := tls.Client(dialer, conf)    client, err := smtp.NewClient(tlsdialer, "smtp.gmail.com:465")或者,您可以使用需要显式 TLS 的端口 587:func Connect() {    dialer, err := Socks("127.0.0.1:9050", "smtp.gmail.com:587")    ...    conf := &tls.Config{ServerName: "smtp.gmail.com"}    err = client.StartTLS(conf)    ...    auth := smtp.PlainAuth("", "mymailaddr@gmail.com", "", "smtp.gmail.com:587")    if err = client.Auth(auth); err != nil {    ...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go