Golang中smtp客户端的自定义拨号器?
Posted
技术标签:
【中文标题】Golang中smtp客户端的自定义拨号器?【英文标题】:Custom dialer for smtp client in Golang? 【发布时间】: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()
函数中的错误
【参考方案1】:
您正在使用端口 465,它需要从开始的 TLS(隐式 TLS),而不是在 STARTTLS 命令之后的通常的 TLS(显式 TLS)。这意味着您用作dialer
的Conn
对象应该已经升级到TLS。为此:
import "crypto/tls"
...
func Connect()
dialer, err := Socks("127.0.0.1:9050", "smtp.gmail.com:465")
...
conf := &tls.ConfigServerName: "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.ConfigServerName: "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
。我刚刚使用了答案中原始问题中变量的命名方案。以上是关于Golang中smtp客户端的自定义拨号器?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 phonegap(Android 和 iOS)创建自定义拨号器