CONNECT туннелин Go'нун SMTP кардарына өткөрүп берүү
Даяр туннел менен smtp.NewClient колдонуп, SMTP хост атын жана STARTTLS кол алышуусун прокси жөндөөсүнөн бөлүк кармаңыз.
smtp.Dial өз дарегине жаңы байланыш ачат. HTTP CONNECT проксиси аркылуу байланыш алгандан кийин, ошол бар агымын ордуна smtp.NewClientке өткөрүп бериңиз.
Жөнөтүү портунда STARTTLS талап кылган SMTP сервери үчүн өткөрүп берүү мындай болушу мүмкүн:
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 аутентификациясы жана сертификатты текшерүү үчүн сактаңыз. HTTPS проксисине TLS байланышы маршруттун башка бөлүгүн коргойт.
Кайтарылган кардар колдонмонун учурдагы SMTP аутентификациясы жана почта транзакциясы үчүн даяр. Бүткөндөн кийин аны жабыңыз. Терүүнү, CONNECT жана кийинки протокол операцияларын колдонмонун мөөнөт саясаты менен чектеңиз.
Прокси тандалган почта портуна CONNECT уруксат бериши керек. Кээ бирлери аны 443 портундагы HTTPS максаттары менен чектешет. Имплициттүү TLS SMTP үчүн STARTTLS чыгаруунун ордуна NewClient чакырганга чейин максаттын TLS сессиясын түзүңүз.