Skip to content

Commit 04ac09a

Browse files
committed
Add smtp client with socks5 proxy
1 parent feedd72 commit 04ac09a

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

client.go

+25
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ import (
1212
"io"
1313
"net"
1414
"net/textproto"
15+
"net/url"
1516
"strconv"
1617
"strings"
1718
"time"
1819

1920
"github.com/emersion/go-sasl"
21+
"github.com/txthinking/socks5"
2022
)
2123

2224
// A Client represents a client connection to an SMTP server.
@@ -61,6 +63,29 @@ func Dial(addr string) (*Client, error) {
6163
return NewClient(conn, host)
6264
}
6365

66+
// DialWithSocks5 returns a new Client connected to an SMTP server via socks5 proxy at addr.
67+
// The addr must include a port, as in "mail.example.com:smtp".
68+
// The socks5URI must include username and password, as in "user:[email protected]:1080"
69+
func DialWithSocks5(addr string, socks5URI string) (*Client, error) {
70+
u, err := url.Parse(socks5URI)
71+
if err != nil {
72+
return nil, err
73+
}
74+
username := u.User.Username()
75+
password, _ := u.User.Password()
76+
socksClient, err := socks5.NewClient(u.Host, username, password, 60, 60)
77+
if err != nil {
78+
return nil, err
79+
}
80+
81+
conn, err := socksClient.Dial("tcp", addr)
82+
if err != nil {
83+
return nil, err
84+
}
85+
host, _, _ := net.SplitHostPort(addr)
86+
return NewClient(conn, host)
87+
}
88+
6489
// DialTLS returns a new Client connected to an SMTP server via TLS at addr.
6590
// The addr must include a port, as in "mail.example.com:smtps".
6691
//

go.mod

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
module github.com/linanh/go-smtp
22

3-
require github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21
3+
require (
4+
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21
5+
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
6+
github.com/txthinking/runnergroup v0.0.0-20200327135940-540a793bb997 // indirect
7+
github.com/txthinking/socks5 v0.0.0-20210106113028-328af325654e
8+
github.com/txthinking/x v0.0.0-20201210150116-a8015a742c8c // indirect
9+
)
410

511
go 1.13

go.sum

+8
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,10 @@
11
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 h1:OJyUGMJTzHTd1XQp98QTaHernxMYzRaOasRir9hUlFQ=
22
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
3+
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
4+
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
5+
github.com/txthinking/runnergroup v0.0.0-20200327135940-540a793bb997 h1:vlDgnShahmE2XLslpr0hnzxfAmSj3JLX2CYi8Xct7G4=
6+
github.com/txthinking/runnergroup v0.0.0-20200327135940-540a793bb997/go.mod h1:CLUSJbazqETbaR+i0YAhXBICV9TrKH93pziccMhmhpM=
7+
github.com/txthinking/socks5 v0.0.0-20210106113028-328af325654e h1:SUWQViHyUHr766NlUKB1Wr8QRVTaxez9sLl3pwobiHw=
8+
github.com/txthinking/socks5 v0.0.0-20210106113028-328af325654e/go.mod h1:d3n8NJ6QMRb6I/WAlp4z5ZPAoaeqDmX5NgVZA0mhe+I=
9+
github.com/txthinking/x v0.0.0-20201210150116-a8015a742c8c h1:n3om7+DhvxNoBTcYul3jpeOTavBGKRjGW1GaLc8JsWc=
10+
github.com/txthinking/x v0.0.0-20201210150116-a8015a742c8c/go.mod h1:WgqbSEmUYSjEV3B1qmee/PpP2NYEz4bL9/+mF1ma+s4=

0 commit comments

Comments
 (0)