Παραδώστε το τούνελ CONNECT στον SMTP client της Go
Χρησιμοποιήστε το smtp.NewClient με ένα ήδη στημένο τούνελ και κρατήστε το όνομα κεντρικού υπολογιστή SMTP και τη χειραψία STARTTLS ξεχωριστά από τη ρύθμιση του proxy.
smtp.Dial ανοίγει μια νέα σύνδεση προς τη διεύθυνσή του. Αφού αποκτήσετε σύνδεση μέσω διακομιστή μεσολάβησης HTTP CONNECT, περάστε αυτή την υπάρχουσα ροή στο smtp.NewClient αντί γι' αυτό.
Για έναν διακομιστή SMTP που απαιτεί STARTTLS στη θύρα υποβολής του, η παράδοση μπορεί να είναι:
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
}Τα πακέτα είναι net, net/smtp και crypto/tls. Ο καλών παρέχει ένα τούνελ ήδη συνδεδεμένο με τον επιθυμητό κεντρικό υπολογιστή και θύρα SMTP, με την ανταλλαγή CONNECT του proxy ολοκληρωμένη. Το άνοιγμα μόνο TCP προς τον proxy δεν αρκεί: μια απόκριση HTTP δεν είναι χαιρετισμός SMTP.
Το mailHost είναι το όνομα κεντρικού υπολογιστή του διακομιστή SMTP, χωρίς θύρα. Διατηρήστε αυτή την ταυτότητα για τον έλεγχο ταυτότητας SMTP και την επαλήθευση πιστοποιητικού. Μια σύνδεση TLS προς proxy HTTPS προστατεύει άλλο σκέλος της διαδρομής.
Ο πελάτης που επιστρέφεται είναι έτοιμος για τον υπάρχοντα έλεγχο ταυτότητας SMTP και τη συναλλαγή αλληλογραφίας της εφαρμογής. Κλείστε τον όταν τελειώσετε. Περιορίστε την κλήση, το CONNECT και τις επόμενες λειτουργίες πρωτοκόλλου με την πολιτική προθεσμιών της εφαρμογής.
Ο proxy πρέπει να επιτρέπει CONNECT στη θύρα αλληλογραφίας που επιλέχθηκε. Μερικοί το περιορίζουν σε προορισμούς HTTPS στη θύρα 443. Για SMTP με έμμεσο TLS, δημιουργήστε τη συνεδρία TLS του προορισμού πριν καλέσετε το NewClient αντί να εκδώσετε STARTTLS.