Lämna över CONNECT-tunneln till Gos SMTP-klient
Använd smtp.NewClient med en redan etablerad tunnel och håll SMTP-värdnamnet och STARTTLS-handskakningen åtskilda från proxyinställningen.
smtp.Dial öppnar en ny anslutning till sin adress. När du har fått en anslutning via en HTTP CONNECT-proxy skickar du den befintliga strömmen till smtp.NewClient i stället.
För en SMTP-server som kräver STARTTLS på sin insändningsport kan överlämningen se ut så här:
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
}Paketen är net, net/smtp och crypto/tls. Anroparen tillhandahåller en tunnel som redan är ansluten till den avsedda SMTP-värden och porten, med proxyns CONNECT-utbyte slutfört. Att bara öppna TCP mot proxyn räcker inte: ett HTTP-svar är inte en SMTP-hälsning.
mailHost är SMTP-serverns värdnamn, utan port. Behåll den identiteten för SMTP-autentisering och certifikatverifiering. En TLS-anslutning till en HTTPS-proxy skyddar ett annat ben av rutten.
Den returnerade klienten är redo för applikationens befintliga SMTP-autentisering och posttransaktion. Stäng den när du är klar. Begränsa uppringning, CONNECT och efterföljande protokolloperationer med applikationens tidsfristpolicy.
Proxyn måste tillåta CONNECT till den valda postporten. Vissa begränsar det till HTTPS-destinationer på port 443. För SMTP med implicit TLS, upprätta destinationens TLS-session innan du anropar NewClient i stället för att utfärda STARTTLS.