Den CONNECT-Tunnel an Gos SMTP-Client übergeben
Nutzen Sie smtp.NewClient mit einem bereits aufgebauten Tunnel und halten Sie SMTP-Hostname und STARTTLS-Handshake getrennt von der Proxy-Einrichtung.
smtp.Dial öffnet eine neue Verbindung zu seiner Adresse. Wenn Sie eine Verbindung über einen HTTP-CONNECT-Proxy erhalten haben, übergeben Sie diesen bestehenden Stream stattdessen an smtp.NewClient.
Für einen SMTP-Server, der STARTTLS an seinem Submission-Port verlangt, kann die Übergabe so aussehen:
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
}Die Pakete sind net, net/smtp und crypto/tls. Der Aufrufer liefert einen Tunnel, der bereits mit dem vorgesehenen SMTP-Host und -Port verbunden ist, wobei der CONNECT-Austausch des Proxys abgeschlossen ist. Nur TCP zum Proxy zu öffnen reicht nicht: Eine HTTP-Antwort ist keine SMTP-Begrüßung.
mailHost ist der Hostname des SMTP-Servers, ohne Port. Behalten Sie diese Identität für die SMTP-Authentifizierung und Zertifikatsprüfung bei. Eine TLS-Verbindung zu einem HTTPS-Proxy schützt einen anderen Abschnitt der Route.
Der zurückgegebene Client ist für die bestehende SMTP-Authentifizierung und Mailtransaktion der Anwendung bereit. Schließen Sie ihn, wenn Sie fertig sind. Begrenzen Sie Wählen, CONNECT und nachfolgende Protokolloperationen mit der Deadline-Richtlinie der Anwendung.
Der Proxy muss CONNECT zum gewählten Mailport erlauben. Manche beschränken ihn auf HTTPS-Ziele auf Port 443. Für SMTP mit implizitem TLS bauen Sie die TLS-Sitzung des Ziels auf, bevor Sie NewClient aufrufen, statt STARTTLS auszugeben.