Overlever CONNECT-tunnelen til Gos SMTP-klient
Bruk smtp.NewClient med en allerede etablert tunnel, og hold SMTP-vertsnavnet og STARTTLS-håndtrykket adskilt fra proxyoppsettet.
smtp.Dial åpner en ny forbindelse til adressen sin. Når du har fått en forbindelse gjennom en HTTP CONNECT-proxy, overleverer du den eksisterende strømmen til smtp.NewClient i stedet.
For en SMTP-server som krever STARTTLS på innsendingsporten, kan overleveringen 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. Kalleparten leverer en tunnel som allerede er koblet til den tiltenkte SMTP-verten 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 sertifikatverifisering. En TLS-forbindelse til en HTTPS-proxy beskytter et annet ben av ruten.
Den returnerte klienten er klar for applikasjonens eksisterende SMTP-autentisering og posttransaksjon. Lukk den når du er ferdig. Begrens oppringing, CONNECT og påfølgende protokolloperasjoner med applikasjonens fristpolitikk.
Proxyen må tillate CONNECT til den valgte postporten. Noen begrenser det til HTTPS-destinasjoner på port 443. For SMTP med implisitt TLS, etabler destinasjonens TLS-økt før du kaller NewClient i stedet for å utstede STARTTLS.