Overlever CONNECT-tunnelen til SMTP-klienten i Go
Bruk smtp.NewClient med ein allereie etablert tunnel, og hald SMTP-vertsnamnet og STARTTLS-handtrykket skilt frå proxyoppsettet.
smtp.Dial opnar ei ny tilkopling til adressa si. Når du har fått ei tilkopling gjennom ein HTTP CONNECT-proxy, overleverer du den eksisterande straumen til smtp.NewClient i staden.
For ein SMTP-tenar som krev STARTTLS på innsendingsporten, kan overleveringa sjå slik ut:
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
}Pakka er net, net/smtp og crypto/tls. Kallaren leverer ein tunnel som allereie er kopla til den tiltenkte SMTP-verten og -porten, med proxyens CONNECT-utveksling fullført. Berre å opne TCP mot proxyen er ikkje nok: eit HTTP-svar er ikkje ei SMTP-helsing.
mailHost er vertsnamnet til SMTP-tenaren, utan port. Hald på den identiteten for SMTP-autentisering og sertifikatstadfesting. Ei TLS-tilkopling til ein HTTPS-proxy verner eit anna bein av ruta.
Den returnerte klienten er klar for den eksisterande SMTP-autentiseringa og posttransaksjonen til applikasjonen. Lat han att når du er ferdig. Avgrens oppringing, CONNECT og seinare protokolloperasjonar med fristpolitikken til applikasjonen.
Proxyen må tillate CONNECT til den valde postporten. Nokre avgrensar det til HTTPS-destinasjonar på port 443. For SMTP med implisitt TLS, etabler TLS-økta til destinasjonen før du kallar NewClient i staden for å gje ut STARTTLS.