Nododiet CONNECT tuneli Go SMTP klientam
Izmantojiet smtp.NewClient ar jau izveidotu tuneli un turiet SMTP resursdatora nosaukumu un STARTTLS rokasspiedienu atsevišķi no starpniekservera iestatījumiem.
smtp.Dial atver jaunu savienojumu uz savu adresi. Pēc savienojuma iegūšanas caur HTTP CONNECT starpniekserveri nododiet šo esošo straumi smtp.NewClient.
SMTP serverim, kas pieprasa STARTTLS tā iesniegšanas portā, nodošana var izskatīties šādi:
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
}Paketes ir net, net/smtp un crypto/tls. Izsaucējs nodrošina tuneli, kas jau ir savienots ar vajadzīgo SMTP resursdatoru un portu, ar pabeigtu starpniekservera CONNECT apmaiņu. Vienkārši atvērt TCP uz starpniekserveri nav pietiekami: HTTP atbilde nav SMTP sveiciens.
mailHost ir SMTP servera resursdatora nosaukums bez porta. Saglabājiet šo identitāti SMTP autentifikācijai un sertifikāta pārbaudei. TLS savienojums ar HTTPS starpniekserveri aizsargā citu maršruta posmu.
Atgrieztais klients ir gatavs lietojumprogrammas esošajai SMTP autentifikācijai un pasta darījumam. Aizveriet to, kad esat pabeidzis. Ierobežojiet zvanīšanu, CONNECT un turpmākās protokola darbības ar lietojumprogrammas termiņu politiku.
Starpniekserverim ir jāatļauj CONNECT uz izvēlēto pasta portu. Daži to ierobežo ar HTTPS galamērķiem 443. portā. SMTP ar implicītu TLS gadījumā izveidojiet galamērķa TLS sesiju pirms NewClient izsaukšanas, nevis izdodiet STARTTLS.