Перадайце тунэль CONNECT SMTP-кліенту Go
Выкарыстоўвайце smtp.NewClient з ужо створаным тунэлем і трымайце імя хоста SMTP і рукапоціск STARTTLS асобна ад налады проксі.
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 праз проксі. Проста адкрыць TCP да проксі недастаткова: адказ HTTP не з'яўляецца прывітаннем SMTP.
mailHost — гэта імя хоста SMTP-сервера без порта. Захавайце гэтую ідэнтычнасць для аўтэнтыфікацыі SMTP і праверкі сертыфіката. Злучэнне TLS з проксі HTTPS абараняе іншае плячо маршруту.
Вяртаны кліент гатовы да існуючай аўтэнтыфікацыі SMTP і паштовай транзакцыі праграмы. Закрыйце яго пасля завяршэння. Абмяжуйце набор, CONNECT і наступныя аперацыі пратаколу палітыкай тэрмінаў праграмы.
Проксі павінен дазваляць CONNECT да абранага паштовага порта. Некаторыя абмяжоўваюць яго HTTPS-прызначэннямі на порце 443. Для SMTP з няяўным TLS усталюйце TLS-сеанс прызначэння перад выклікам NewClient замест выдачы STARTTLS.