Предајте CONNECT тунел Go SMTP клијенту
Користите 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-а.