Predajte CONNECT tunel Go SMTP klijentu
Koristite smtp.NewClient s uspostavljenim tunelom i držite ime SMTP hosta i STARTTLS rukovanje odvojeno od postavljanja proxyja.
smtp.Dial otvara novu vezu prema svojoj adresi. Nakon što dobijete vezu kroz HTTP CONNECT proxy, proslijedite taj postojeći tok funkciji smtp.NewClient umjesto toga.
Za SMTP poslužitelj koji zahtijeva 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. Pozivatelj dostavlja tunel već povezan s ciljnim SMTP hostom i portom, uz završenu razmjenu CONNECT na proxyju. Samo otvaranje TCP-a prema proxyju nije dovoljno: HTTP odgovor nije SMTP pozdrav.
mailHost je ime hosta SMTP poslužitelja, bez porta. Zadržite taj identitet za SMTP autentifikaciju i provjeru certifikata. TLS veza prema HTTPS proxyju štiti drugu dionicu rute.
Vraćeni klijent spreman je za postojeću SMTP autentifikaciju i poštansku transakciju aplikacije. Zatvorite ga kada završite. Ograničite biranje, CONNECT i sljedeće protokolarne operacije politikom rokova aplikacije.
Proxy mora dopustiti CONNECT prema odabranom poštanskom portu. Neki ga ograničavaju na HTTPS odredišta na portu 443. Za SMTP s implicitnim TLS-om uspostavite TLS sesiju odredišta prije pozivanja NewClient, umjesto izdavanja STARTTLS-a.