Giv CONNECT-tunnelen videre til Gos SMTP-klient
Brug smtp.NewClient med en etableret tunnel, og hold SMTP-værtsnavnet og STARTTLS-håndtrykket adskilt fra proxyopsætningen.
smtp.Dial åbner en ny forbindelse til sin adresse. Når du har fået en forbindelse gennem en HTTP CONNECT-proxy, skal du give den eksisterende strøm videre til smtp.NewClient i stedet.
For en SMTP-server, der kræver STARTTLS på sin indsendelsesport, kan overdragelsen se sådan ud:
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
}Pakkerne er net, net/smtp og crypto/tls. Kalderen leverer en tunnel, der allerede er forbundet til den tilsigtede SMTP-vært og -port, med proxyens CONNECT-udveksling afsluttet. Det er ikke nok blot at åbne TCP til proxyen: et HTTP-svar er ikke en SMTP-hilsen.
mailHost er SMTP-serverens værtsnavn uden port. Behold den identitet til SMTP-godkendelse og certifikatverifikation. En TLS-forbindelse til en HTTPS-proxy beskytter et andet ben af ruten.
Den returnerede klient er klar til applikationens eksisterende SMTP-godkendelse og posttransaktion. Luk den, når du er færdig. Begræns opkald, CONNECT og efterfølgende protokoloperationer med applikationens deadline-politik.
Proxyen skal tillade CONNECT til den valgte postport. Nogle begrænser det til HTTPS-destinationer på port 443. For SMTP med implicit TLS skal du etablere destinationens TLS-session, før NewClient kaldes, i stedet for at udstede STARTTLS.