Geef de CONNECT-tunnel door aan Go's SMTP-client
Gebruik smtp.NewClient met een al opgezette tunnel en houd de SMTP-hostnaam en de STARTTLS-handshake gescheiden van de proxyconfiguratie.
smtp.Dial opent een nieuwe verbinding naar zijn adres. Nadat je een verbinding via een HTTP CONNECT-proxy hebt verkregen, geef je die bestaande stream in plaats daarvan door aan smtp.NewClient.
Voor een SMTP-server die STARTTLS op zijn inzendpoort vereist, kan de overdracht er zo uitzien:
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
}De pakketten zijn net, net/smtp en crypto/tls. De aanroeper levert een tunnel die al is verbonden met de beoogde SMTP-host en -poort, met de CONNECT-uitwisseling van de proxy voltooid. Alleen TCP naar de proxy openen is niet genoeg: een HTTP-antwoord is geen SMTP-groet.
mailHost is de hostnaam van de SMTP-server, zonder poort. Behoud die identiteit voor SMTP-authenticatie en certificaatverificatie. Een TLS-verbinding naar een HTTPS-proxy beschermt een ander deel van de route.
De teruggegeven client is klaar voor de bestaande SMTP-authenticatie en mailtransactie van de applicatie. Sluit hem wanneer je klaar bent. Beperk kiezen, CONNECT en volgende protocolbewerkingen met het deadlinebeleid van de applicatie.
De proxy moet CONNECT naar de gekozen mailpoort toestaan. Sommige beperken dit tot HTTPS-bestemmingen op poort 443. Voor SMTP met impliciete TLS stel je de TLS-sessie van de bestemming in voordat je NewClient aanroept, in plaats van STARTTLS uit te geven.