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 փոխանակումն ավարտված։ Միայն proxy-ին TCP բացելը բավարար չէ․ HTTP պատասխանը SMTP ողջույն չէ։
mailHost-ը SMTP սերվերի հոսթի անունն է՝ առանց պորտի։ Պահեք այդ ինքնությունը SMTP նույնականացման և սերտիֆիկատի ստուգման համար։ HTTPS proxy-ին TLS կապը պաշտպանում է երթուղու մեկ այլ հատված։
Վերադարձված հաճախորդը պատրաստ է հավելվածի գոյություն ունեցող SMTP նույնականացմանը և փոստային գործարքին։ Փակեք այն ավարտելուց հետո։ Սահմանափակեք հավաքումը, CONNECT-ը և հետագա արձանագրային գործողությունները հավելվածի ժամկետների քաղաքականությամբ։
Proxy-ն պետք է թույլատրի CONNECT ընտրված փոստային պորտին։ Ոմանք այն սահմանափակում են 443 պորտի HTTPS նպատակներով։ Իմպլիցիտ TLS-ով SMTP-ի համար նշանակման TLS սեսիան հաստատեք NewClient-ը կանչելուց առաջ՝ STARTTLS ուղարկելու փոխարեն։