Entregue o túnel CONNECT ao cliente SMTP do Go
Use smtp.NewClient com um túnel já estabelecido e mantenha o nome de host SMTP e o handshake STARTTLS separados da configuração do proxy.
smtp.Dial abre uma nova conexão para o seu endereço. Depois de obter uma conexão por meio de um proxy HTTP CONNECT, passe esse fluxo existente para smtp.NewClient em vez disso.
Para um servidor SMTP que exige STARTTLS na sua porta de envio, 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 pacotes são net, net/smtp e crypto/tls. O chamador fornece um túnel já conectado ao host e à porta SMTP desejados, com a troca CONNECT do proxy concluída. Apenas abrir TCP para o proxy não basta: uma resposta HTTP não é uma saudação SMTP.
mailHost é o nome de host do servidor SMTP, sem porta. Preserve essa identidade para autenticação SMTP e verificação de certificado. Uma conexão TLS com um proxy HTTPS protege outro trecho da rota.
O cliente retornado está pronto para a autenticação SMTP e a transação de correio existentes da aplicação. Feche-o quando terminar. Limite a discagem, o CONNECT e as operações de protocolo seguintes com a política de prazos da aplicação.
O proxy deve permitir CONNECT para a porta de correio escolhida. Alguns restringem isso a destinos HTTPS na porta 443. Para SMTP com TLS implícito, estabeleça a sessão TLS de destino antes de chamar NewClient em vez de emitir STARTTLS.