Overfør CONNECT-tunnelen til Gos SMTP-klient
Bruk smtp.NewClient med en allerede etablert tunnel, og hold SMTP-vertsnavnet og STARTTLS-håndtrykket atskilt fra proxyoppsettet.
smtp.Dial åpner en ny forbindelse til adressen. Etter at du har fått en forbindelse gjennom en HTTP CONNECT-proxy, gir du den eksisterende strømmen til smtp.NewClient i stedet.
For en SMTP-server som krever STARTTLS på innsendingsporten, kan overføringen se 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
}Pakkene er net, net/smtp og crypto/tls. Den som kaller, leverer en tunnel som allerede er koblet til den ønskede SMTP-vertsmaskinen og porten, med proxyens CONNECT-utveksling fullført. Bare å åpne TCP mot proxyen er ikke nok: et HTTP-svar er ikke en SMTP-hilsen.
mailHost er vertsnavnet til SMTP-serveren, uten port. Behold den identiteten for SMTP-autentisering og sertifikatkontroll. En TLS-forbindelse til en HTTPS-proxy beskytter en annen del av ruten.
Klienten som returneres, er klar for applikasjonens eksisterende SMTP-autentisering og posttransaksjon. Lukk den når du er ferdig. Begrens oppringing, CONNECT og senere protokolloperasjoner med applikasjonens fristpolicy.
Proxyen må tillate CONNECT til den valgte postporten. Noen begrenser det til HTTPS-mål på port 443. For SMTP med implisitt TLS, opprett TLS-økten til målet før du kaller NewClient i stedet for å sende STARTTLS.