Skip to content

Instantly share code, notes, and snippets.

@MarlikAlmighty
Created January 16, 2022 01:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MarlikAlmighty/e340216e6d338a80a47e9f87f8e41163 to your computer and use it in GitHub Desktop.
Save MarlikAlmighty/e340216e6d338a80a47e9f87f8e41163 to your computer and use it in GitHub Desktop.
Send email over socks proxy on golang
package main
import (
"crypto/tls"
"fmt"
"io"
"log"
"net"
"net/mail"
"time"
"net/smtp"
"golang.org/x/net/proxy"
)
func main() {
from := mail.Address{Address: "mail from"}
to := mail.Address{Address: "mail to"}
subj := "This is the email subject"
body := "This is an example body.\n With two lines."
serverName := "smtp.mail.ru:465"
proxyAddr := "0.0.0.0:3000"
auth := smtp.PlainAuth("", "user", "password", serverName)
proxyAuth := proxy.Auth{
User: "admin",
Password: "123456",
}
baseDialer := &net.Dialer{
Timeout: 3 * time.Second,
KeepAlive: 3 * time.Second,
}
dialer, err := proxy.SOCKS5("tcp", proxyAddr, &proxyAuth, baseDialer)
if err != nil {
log.Fatal(err)
}
var cn net.Conn
if cn, err = dialer.Dial("tcp", serverName); err != nil {
log.Fatal(err)
}
conf := &tls.Config{
ServerName: serverName,
InsecureSkipVerify: true,
}
tlsConn := tls.Client(cn, conf)
var cl *smtp.Client
if cl, err = smtp.NewClient(tlsConn, serverName); err != nil {
log.Fatal(err)
}
defer cl.Close()
defer cl.Quit()
if err = cl.Hello("localhost"); err != nil {
log.Fatal(err)
}
if err = cl.Auth(auth); err != nil {
log.Fatal(err)
}
if err = cl.Mail(from.Address); err != nil {
log.Fatal(err)
}
if err = cl.Rcpt(to.Address); err != nil {
log.Fatal(err)
}
var w io.WriteCloser
if w, err = cl.Data(); err != nil {
log.Fatal(err)
}
headers := make(map[string]string)
headers["From"] = from.String()
headers["To"] = to.String()
headers["Subject"] = subj
msg := ""
for k, v := range headers {
msg += fmt.Sprintf("%s: %s\r\n", k, v)
}
msg += fmt.Sprintf("\r\n" + body)
if _, err = w.Write([]byte(msg)); err != nil {
log.Fatal(err)
}
if err = w.Close(); err != nil {
log.Fatal(err)
}
log.Println("Ok, exit.")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment