Golang的smtp客户端的自定义拨号程序?

时间:2018-08-15 09:21:35

标签: go proxy smtp socks

我尝试通过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服务器与袜子代理连接吗?我在Google中找不到答案,也找不到任何库提供此功能。

1 个答案:

答案 0 :(得分:1)

您正在使用端口465,该端口期望从开始就使用TLS(隐式TLS),而不是在STARTTLS命令后使用通常的TLS(显式TLS)。这意味着您用作Conn的{​​{1}}对象应该已经升级到TLS。为此:

dialer

或者,您可以使用需要显式TLS的端口587:

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")