CONNECT გვირაბი გადაეცით Go-ს SMTP კლიენტს
გამოიყენეთ smtp.NewClient უკვე დამყარებული გვირაბით და SMTP ჰოსტის სახელი და STARTTLS ხელის ჩამორთმევა ცალკე შეინახეთ proxy-ს კონფიგურაციისგან.
smtp.Dial ახალ კავშირს ხსნის თავის მისამართზე. HTTP CONNECT proxy-ს მეშვეობით კავშირის მიღების შემდეგ, ეს არსებული ნაკადი გადაეცით 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 ჰოსტთან და პორტთან, proxy-ს CONNECT გაცვლის დასრულებით. მხოლოდ TCP-ის გახსნა proxy-სკენ საკმარისი არ არის: HTTP პასუხი SMTP მისალმება არ არის.
mailHost არის SMTP სერვერის ჰოსტის სახელი, პორტის გარეშე. შეინარჩუნეთ ეს იდენტობა SMTP ავთენტიფიკაციისა და სერტიფიკატის შემოწმებისთვის. TLS კავშირი HTTPS proxy-სთან მარშრუტის სხვა მონაკვეთს იცავს.
დაბრუნებული კლიენტი მზად არის აპლიკაციის არსებული SMTP ავთენტიფიკაციისა და ფოსტის ტრანზაქციისთვის. დახურეთ იგი დასრულებისას. შეზღუდეთ აკრეფა, CONNECT და შემდგომი პროტოკოლური ოპერაციები აპლიკაციის ვადების პოლიტიკით.
proxy-მ უნდა დაუშვას CONNECT არჩეულ ფოსტის პორტზე. ზოგი მას 443 პორტზე HTTPS დანიშნულებებით ზღუდავს. იმპლიციტური TLS-ის SMTP-სთვის, STARTTLS-ის გაცემის ნაცვლად, NewClient-ის გამოძახებამდე დაამყარეთ დანიშნულების TLS სესია.