Adja át a CONNECT-alagutat a Go SMTP-kliensének
Használja a smtp.NewClientet egy már létrehozott alagúttal, és tartsa külön az SMTP-gépnevet és a STARTTLS-kézfogást a proxy beállításától.
smtp.Dial új kapcsolatot nyit a címére. Miután HTTP CONNECT proxyn keresztül kapcsolatot szerzett, adja át a meglévő adatfolyamot a smtp.NewClientnek.
Egy olyan SMTP-kiszolgáló esetén, amely STARTTLS-t követel a beküldési portján, az átadás így nézhet ki:
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
}A csomagok: net, net/smtp és crypto/tls. A hívó egy már a kívánt SMTP-géphez és porthoz kapcsolódó alagutat biztosít, a proxy CONNECT-cseréje befejeződött. Önmagában TCP-t nyitni a proxy felé nem elég: a HTTP-válasz nem SMTP-köszöntés.
mailHost az SMTP-kiszolgáló gépneve, port nélkül. Őrizze meg ezt az azonosságot az SMTP-hitelesítéshez és a tanúsítvány-ellenőrzéshez. Az HTTPS-proxyhoz irányuló TLS-kapcsolat az útvonal másik szakaszát védi.
A visszaadott kliens készen áll az alkalmazás meglévő SMTP-hitelesítésére és levélügyletére. Zárja be, ha végzett. A tárcsázást, a CONNECT-et és a további protokollműveleteket az alkalmazás határidő-szabályzatával korlátozza.
A proxynak engedélyeznie kell a CONNECT-et a kiválasztott levélport felé. Egyesek csak a 443-as port HTTPS-céljaira korlátozzák. Implicit TLS-es SMTP esetén a STARTTLS kiadása helyett a cél TLS-munkamenetét hozza létre a NewClient meghívása előtt.