Предајте го тунелот 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.