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.

Ähnliche Artikel