Predajte CONNECT tunel Go SMTP klijentu
Koristite smtp.NewClient sa uspostavljenim tunelom i držite ime SMTP hosta i STARTTLS rukovanje odvojeno od podešavanja proksija.
smtp.Dial otvara novu vezu prema svojoj adresi. Nakon što dobijete vezu kroz HTTP CONNECT proksi, prosledite taj postojeći tok funkciji smtp.NewClient umesto toga.
Za SMTP server koji zahteva STARTTLS na svom portu za slanje, predaja može izgledati ovako:
func smtpOverTunnel(conn net.Conn, mailHost string) (*smtp.Client, error) {
client, err := smtp.NewClient(conn, mailHost)
if err != nil {
conn.Close()
return nil, err
}
err = client.StartTLS(&tls.Config{
ServerName: mailHost,
MinVersion: tls.VersionTLS12,
})
if err != nil {
client.Close()
return nil, err
}
return client, nil
}Paketi su net, net/smtp i crypto/tls. Pozivalac dostavlja tunel već povezan sa ciljnim SMTP hostom i portom, uz završenu razmenu CONNECT na proksiju. Samo otvaranje TCP-a prema proksiju nije dovoljno: HTTP odgovor nije SMTP pozdrav.
mailHost je ime hosta SMTP servera, bez porta. Zadržite taj identitet za SMTP autentifikaciju i proveru sertifikata. TLS veza prema HTTPS proksiju štiti drugu deonicu rute.
Vraćeni klijent je spreman za postojeću SMTP autentifikaciju i poštansku transakciju aplikacije. Zatvorite ga kada završite. Ograničite biranje, CONNECT i naredne protokolarne operacije politikom rokova aplikacije.
Proksi mora dozvoliti CONNECT prema izabranom poštanskom portu. Neki ga ograničavaju na HTTPS odredišta na portu 443. Za SMTP sa implicitnim TLS-om uspostavite TLS sesiju odredišta pre pozivanja NewClient, umesto izdavanja STARTTLS-a.