登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-10 22:18:37 365浏览 收藏

你在学习Golang相关的知识吗?本文《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("", "[email protected]", "", "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 中没有找到答案,也没有找到任何提供此功能的库。


解决方案


您使用的端口 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("", "[email protected]", "", "smtp.gmail.com:587")
    if err = client.Auth(auth); err != nil {
    ...

今天关于《Golang 中 smtp 客户端的自定义拨号器?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>