smtp.Dial abre unha conexión nova ao seu enderezo. Despois de obter unha conexión a través dun proxy HTTP CONNECT, pasa ese fluxo existente a smtp.NewClient no seu lugar.

Para un servidor SMTP que require STARTTLS no seu porto de envío, a entrega pode ser:

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
}

Os paquetes son net, net/smtp e crypto/tls. O chamador fornece un túnel xa conectado ao host e porto SMTP desexados, co intercambio CONNECT do proxy completado. Abrir só TCP cara ao proxy non abonda: unha resposta HTTP non é un saúdo SMTP.

mailHost é o nome de host do servidor SMTP, sen porto. Conserva esa identidade para a autenticación SMTP e a verificación do certificado. Unha conexión TLS a un proxy HTTPS protexe outro tramo da ruta.

O cliente devolto está listo para a autenticación SMTP e a transacción de correo existentes da aplicación. Péchao cando remates. Limita a marcación, o CONNECT e as operacións de protocolo posteriores coa política de prazos da aplicación.

O proxy debe permitir CONNECT cara ao porto de correo elixido. Algúns restrinxen iso a destinos HTTPS no porto 443. Para SMTP con TLS implícito, establece a sesión TLS de destino antes de chamar a NewClient en lugar de emitir STARTTLS.

Artigos relacionados