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.

Relaterede artikler