gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:59 25 4
gpt4 key购买 nike

我正在尝试通过 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 代理吗?我在 Google 中找不到答案,也没有找到任何图书馆提供此功能。

最佳答案

您使用的端口 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 - Golang 中 smtp 客户端的自定义拨号器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51856084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com