【问题标题】:Custom dialer for smtp client in Golang?Golang中smtp客户端的自定义拨号器?
【发布时间】:2018-08-15 09:21:35
【问题描述】:

我正在尝试通过 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 是否可以通过 socks 代理连接 smtp 服务器?我在 Google 中找不到答案,也没有找到任何提供此功能的库。

【问题讨论】:

  • 您不应忽略 Socks() 函数中的错误

标签: go proxy smtp socks


【解决方案1】:

您正在使用端口 465,它需要从开始的 TLS(隐式 TLS),而不是在 STARTTLS 命令之后的通常的 TLS(显式 TLS)。这意味着您用作dialerConn 对象应该已经升级到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 {
    ...

【讨论】:

  • 感谢您的帮助!
  • @АндрейАнтонов 这对你有用吗?你能在代理后面使用 GO smtp 客户端发送电子邮件吗?
  • 我不明白这个答案。这两个函数都需要第一个参数是连接而不是拨号器:tls.Client([connection], conf)smtp.NewClient([connection],...)。你是怎么做到的?
  • @WildCat:不要让你被变量名弄糊涂了。由Socks 返回的dialer 是一个Conn,而由tls.Client 返回的tlsdialer 也是一个Conn。我刚刚使用了答案中原始问题中变量的命名方案。
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多