Confiez le tunnel CONNECT au client SMTP de Go
Utilisez smtp.NewClient avec un tunnel déjà établi et gardez le nom d'hôte SMTP et la poignée de main STARTTLS séparés de la configuration du proxy.
smtp.Dial ouvre une nouvelle connexion vers son adresse. Après avoir obtenu une connexion via un proxy HTTP CONNECT, passez ce flux existant à smtp.NewClient à la place.
Pour un serveur SMTP qui exige STARTTLS sur son port de soumission, le transfert peut être :
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
}Les paquets sont net, net/smtp et crypto/tls. L'appelant fournit un tunnel déjà connecté à l'hôte et au port SMTP voulus, avec l'échange CONNECT du proxy terminé. Ouvrir simplement TCP vers le proxy ne suffit pas : une réponse HTTP n'est pas une salutation SMTP.
mailHost est le nom d'hôte du serveur SMTP, sans port. Conservez cette identité pour l'authentification SMTP et la vérification du certificat. Une connexion TLS vers un proxy HTTPS protège un autre segment de la route.
Le client renvoyé est prêt pour l'authentification SMTP et la transaction de courrier existantes de l'application. Fermez-le lorsque vous avez terminé. Limitez la composition, le CONNECT et les opérations de protocole suivantes avec la politique d'échéance de l'application.
Le proxy doit autoriser CONNECT vers le port de courrier choisi. Certains le limitent aux destinations HTTPS sur le port 443. Pour SMTP avec TLS implicite, établissez la session TLS de destination avant d'appeler NewClient au lieu d'émettre STARTTLS.